Open atjiu opened 5 years ago
再提一个建议,给选择的主题加上缓存,下次再打开app的时候,还是上一次选择的主题
折腾这个的时候我还碰到个问题,就是把enum存到UserDefaults里时报错,后来通过能enum设置rawValue解决了
ThemeManager
/// 当前使用的主题
var theme: ThemeProtocol!
var type: ThemeType!
//MARK: - Private Method
/// ThemeManager的私有构造器
private override init() {
super.init()
if let themeType = UserDefaults.standard.object(forKey: "themeType") {
if themeType as! ThemeType.RawValue == ThemeType.normal.rawValue {
self.theme = NormalTheme()
self.type = ThemeType.normal
} else {
self.theme = NightTheme()
self.type = ThemeType.night
}
} else {
self.theme = NormalTheme()
self.type = .normal
UserDefaults.standard.set(ThemeType.normal.rawValue, forKey: "themeType")
}
}
/// 切换主题的方法
///
/// - Parameter type: 要切换主题的枚举类型
private func switcherTheme(type: ThemeType){
self.theme = type.theme
self.type = type
UserDefaults.standard.set(type.rawValue, forKey: "themeType")
NotificationCenter.default.post(name: ThemeNotifacationName, object: self.theme)
}
ThemeType
enum ThemeType: Int {
case normal = 0
case night = 1
var theme: ThemeProtocol {
get {
switch self {
case .normal:
return NormalTheme()
case .night:
return NightTheme()
}
}
}
}
这样设置后,下次再切换主题后就还是之前那个主题了 😂
感谢提供这么通俗易懂的教程
这样在其它地方可以获取到当前主题是哪一套,比如设置
self.navigationController?.navigationBar.barStyle
的时候,就可以通过这个来判断了大大还有更优雅的实现方法吗?