我正在尝试在我的应用程序中实现一种明暗模式。在settingsViewController中,我有以下几行代码:
//Sets user default for colour
let lightMode = UserDefaults.standard.bool(forKey: "lightMode")
//UISegment control for user to pick colour
@IBOutlet var colourSegment: UISegmentedControl!
//Updates lightMode based on user selection
@IBAction func didChangeColours(_ sender: Any) {
if colourSegment.selectedSegmentIndex == 0 {
UserDefaults.standard.set(true, forKey: "lightMode")
} else if colourSegment.selectedSegmentIndex == 1 {
UserDefaults.standard.set(false, forKey: "lightMode")
}
}在我的entryViewController和我的viewDidLoad中,我有:
let lightMode = UserDefaults.standard.bool(forKey: "lightMode")
if lightMode == false {
Colours.darkMode()
}
customisations()我遇到的问题是,由于某些原因,我的应用程序只有在我重启它之后才会改变它的配色方案。也就是说,如果用户选择colourSegment的darkIndex,应用程序只会在我重新启动后更新颜色。我想知道这个问题的解决方案是什么。
发布于 2017-08-16 12:58:22
问题出在队伍里-
//Sets user default for colour
let lightMode = UserDefaults.standard.bool(forKey: "lightMode")这一行不是用来设置用户默认值的,而是用来获取UserDefaults的。因为您在设置默认值之前使用它,所以它不能反映正确的分段选择。因此,您的设置部分是正确的,您应该在设置之后才能获取该值。
同样,在你的entryViewController中,不要在settingsVC中使用它,而是执行以下操作-
//get from UserDefaults
let lightMode = UserDefaults.standard.bool(forKey: "lightMode")
//Compare the previous fetched value
if lightMode == false {
Colours.darkMode()
}
//This function sets the colour for the elements
colours()发布于 2017-08-16 12:59:57
因为在初始化过程中只分配了一次lightMode值,所以没有反映出对变量的更改,所以它始终是该值
要始终获取最新的值,请使用以下命令:
let lightMode: Bool {
get {
return UserDefaults.standard.bool(forKey: "lightMode")
}
}此外,您应该在更改值之后立即调用颜色更改
发布于 2017-08-16 13:40:20
我假设您从settingsViewController返回到entryViewController;由于您返回到现有的视图控制器实例,因此返回时不会执行viewDidLoad中的代码。
将代码移到viewWillAppear;这样,即使您返回到现有实例,您的代码也将在视图控制器出现之前执行:
func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let lightMode = UserDefaults.standard.bool(forKey: "lightMode")
if lightMode == false {
Colours.darkMode()
}
}https://stackoverflow.com/questions/45705328
复制相似问题