我正在尝试在我的应用程序中实现明暗模式。在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()
我遇到的问题是,由于某种原因,我的应用程序只是在重新启动它后才改变它的配色方案。也就是说,如果用户选择darkIndex
的{{1}},则应用程序仅在重新启动后更新颜色。我想知道这是什么解决方案。
答案 0 :(得分:2)
问题在于 -
//Sets user default for colour
let lightMode = UserDefaults.standard.bool(forKey: "lightMode")
此行不是用于设置Userdefaults,而是用于获取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()
答案 1 :(得分:0)
由于您在初始化期间仅分配lightMode
值一次,因此您无法反映变量的变化,因此它始终是该值
要始终获得最新值,请使用:
let lightMode: Bool {
get {
return UserDefaults.standard.bool(forKey: "lightMode")
}
}
此外,您应该在更改值
后立即调用颜色更改答案 2 :(得分:0)
我假设您从entryViewController
返回settingsViewController
;由于您将返回到现有的视图控制器实例,因此返回时不会执行viewDidLoad
中的代码。
将代码移至viewWillAppear
;这样,即使返回到现有实例,您的代码也会在视图控制器出现之前执行:
func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let lightMode = UserDefaults.standard.bool(forKey: "lightMode")
if lightMode == false {
Colours.darkMode()
}
}