【问题标题】:Update UserDefaults changes in real time实时更新 UserDefaults 更改
【发布时间】:2018-09-10 21:15:30
【问题描述】:

当用户点击按钮时,它会更改 UserDefaults 以更改启用暗模式的背景颜色。但我希望当用户点击我的按钮时,颜色变化过渡会实时发生,就像 Twitter 应用程序所做的那样,而无需每次都重新打开应用程序。有什么办法可以做到吗?

这是按钮的代码:

@IBAction func changeState(_ sender: UIButton) {
    let isDarkMode = UserDefaults.standard.bool(forKey: "isDarkMode")

    if isDarkMode == true {
        UserDefaults.standard.set(false, forKey: "isDarkMode")  // Set the state
    }else{
        UserDefaults.standard.set(true, forKey: "isDarkMode")  // Set the state
    }
}

这是我用来更新 UI 颜色的代码:

 override func viewDidLoad() {
    super.viewDidLoad()

    let isDarkMode = UserDefaults.standard.bool(forKey: "isDarkMode")  // Retrieve the state

    if isDarkMode == false{
        self.navigationController?.navigationBar.isTranslucent = false
        self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]//user global variable
        self.navigationController?.navigationBar.barStyle = UIBarStyle.default //user global variable
        self.navigationController?.navigationBar.tintColor = UIColor.white //user global variable
        UIApplication.shared.statusBarStyle = .default
        appVersionLabel.textColor = UIColor.black
        lightModeLabel.isHidden = true
        self.tabBarController?.tabBar.barTintColor = UIColor.black
        settingsView.backgroundColor = UIColor.white

        darkModeButton.setImage(UIImage(named: "darkModeDisableButton")?.withRenderingMode(.alwaysOriginal), for: .normal)

    }else{

        UIApplication.shared.statusBarStyle = .lightContent
        self.navigationController?.navigationBar.isTranslucent = false
    self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]//user global variable
        self.navigationController?.navigationBar.barStyle = UIBarStyle.default //user global variable
        self.navigationController?.navigationBar.tintColor = UIColor.white //user global variable
        UIApplication.shared.statusBarStyle = .lightContent
        appVersionLabel.textColor = UIColor.white
        darkModeLabel.isHidden = true
        self.tabBarController?.tabBar.barTintColor = UIColor.black
        settingsView.backgroundColor = UIColor(red: 35/255, green: 35/255, blue: 35/255, alpha: 1)


        darkModeButton.setImage(UIImage(named: "darkModeEnableButton")?.withRenderingMode(.alwaysOriginal), for: .normal)
    }

【问题讨论】:

  • 这与 UserDefaults 无关。您需要编写代码以根据更新后的首选项立即更新您的 UI。
  • 与您的问题无关,但您在changeState 中的if/else 可以替换为一行:UserDefaults.standard.set(!isDarkMode, forKey: "isDarkMode")
  • 也无关,但强烈建议您查看导航栏周围的扩展,并可能使用 uilabel 来清理此代码。真的会提高可读性并简化这一点。

标签: ios swift nsuserdefaults


【解决方案1】:

在一个函数中隔离主题代码:

func changeMode(mode: Bool) {
    let bar = self.navigationController?.navigationBar
    if mode == false {
        bar?.isTranslucent = false
        bar?.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]//user global variable
        bar?.barStyle = UIBarStyle.default //user global variable
        bar?.tintColor = UIColor.white //user global variable
        UIApplication.shared.statusBarStyle = .default
        appVersionLabel.textColor = UIColor.black
        lightModeLabel.isHidden = true
        self.tabBarController?.tabBar.barTintColor = UIColor.black
        settingsView.backgroundColor = UIColor.white

        darkModeButton.setImage(UIImage(named: "darkModeDisableButton")?.withRenderingMode(.alwaysOriginal), for: .normal)

    } else {

        UIApplication.shared.statusBarStyle = .lightContent
        bar?.isTranslucent = false
        bar?.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]//user global variable
        bar?.barStyle = UIBarStyle.default //user global variable
        bar?.tintColor = UIColor.white //user global variable
        UIApplication.shared.statusBarStyle = .lightContent
        appVersionLabel.textColor = UIColor.white
        darkModeLabel.isHidden = true
        self.tabBarController?.tabBar.barTintColor = UIColor.black
        settingsView.backgroundColor = UIColor(red: 35/255, green: 35/255, blue: 35/255, alpha: 1)

        darkModeButton.setImage(UIImage(named: "darkModeEnableButton")?.withRenderingMode(.alwaysOriginal), for: .normal)
    }
}

您的viewDidLoad() 将如下所示:

override func viewDidLoad() {
    super.viewDidLoad()

    let isDarkMode = UserDefaults.standard.bool(forKey: "isDarkMode")  // Retrieve the state
    changeMode(mode: isDarkMode)
}

还有你的 IBAction:

@IBAction func changeState(_ sender: UIButton) {
    let isDarkMode = UserDefaults.standard.bool(forKey: "isDarkMode")
    //Pointed out by rmaddy
    UserDefaults.standard.set(!isDarkMode, forKey: "isDarkMode")
    changeMode(mode: !isDarkMode)
}

【讨论】:

  • 谢谢,它运行良好。如果我还想更改此视图背后的背景颜色?就是这样:dropbox.com/s/4n983zd5bimvs6e/…
  • 您可以随意设置changeMode(mode: Bool) 中的视图样式,例如yourView.backgroundColor = UIColor.yellow...
  • 它适用于设置页面,但在更改背景视图的颜色时它不适用于我
  • 您还必须检查其他视图控制器中的isDarkMode 变量。
  • 是的,代码几乎是一样的,我也试过用viewDidAppear()之类的东西来改变viewDidLoad(),但是没有
猜你喜欢
  • 1970-01-01
  • 2021-03-30
  • 2022-01-07
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 2020-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多