【发布时间】: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