lizelu / CEThemeSwitcher

http://www.cnblogs.com/ludashi/p/6289741.html
66 stars 18 forks source link

建议在ThemeManager里再加一个 type 用来区分当前主题是哪一套 #1

Open atjiu opened 5 years ago

atjiu commented 5 years ago

感谢提供这么通俗易懂的教程

class ThemeManager: NSObject {
    /// 当前使用的主题
    var theme: ThemeProtocol = NormalTheme()     //默认是NormalTheme
    var type: ThemeType = .normal
    /// .....

    //MARK: - Private Method
    /// ThemeManager的私有构造器
    private override init() {}

    /// 切换主题的方法
    ///
    /// - Parameter type: 要切换主题的枚举类型
    private func switcherTheme(type: ThemeType){
        self.theme = type.theme
        self.type = type
        NotificationCenter.default.post(name: ThemeNotifacationName, object: self.theme)
    }
}

这样在其它地方可以获取到当前主题是哪一套,比如设置 self.navigationController?.navigationBar.barStyle 的时候,就可以通过这个来判断了

if ThemeManager.shareInstance().type == .normal {
    self.navigationController?.navigationBar.barStyle = .default
} else {
    self.navigationController?.navigationBar.barStyle = .black
}

大大还有更优雅的实现方法吗?

atjiu commented 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()
            }
        }
    }
}

这样设置后,下次再切换主题后就还是之前那个主题了 😂