用户默认值仅在重启时工作
User defaults Only Working On Restart
我正在尝试在我的应用程序中实现明暗模式。在 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
,应用程序只会在我重新启动后更新颜色。我想知道解决这个问题的方法是什么。
问题在行 -
//Sets user default for colour
let lightMode = UserDefaults.standard.bool(forKey: "lightMode")
此行不是用于设置 Userdefaults,而是获取 UserDefaults。由于您在设置默认值之前使用它,因此它不会反映正确的分段选择。所以你的设置部分是正确的,你应该只在你设置它之后获取值。
同样在您的 entryViewController 中,不要从 settingVC 中使用它,而是执行以下操作 -
//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 次 lightMode
值,所以您没有反映对变量的更改,因此它将始终是该值
要始终获取最新值,请使用:
let lightMode: Bool {
get {
return UserDefaults.standard.bool(forKey: "lightMode")
}
}
另外,你应该在更改值后立即调用颜色更改
我假设您正在 return 从您的 settingsViewController
连接到您的 entryViewController
;由于您正在 returning 到现有的视图控制器实例,因此当您 return.
时 viewDidLoad
中的代码不会执行
将代码移至viewWillAppear
;这样你的代码将在视图控制器出现之前执行,即使你 return 到现有实例:
func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let lightMode = UserDefaults.standard.bool(forKey: "lightMode")
if lightMode == false {
Colours.darkMode()
}
}
我正在尝试在我的应用程序中实现明暗模式。在 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
,应用程序只会在我重新启动后更新颜色。我想知道解决这个问题的方法是什么。
问题在行 -
//Sets user default for colour
let lightMode = UserDefaults.standard.bool(forKey: "lightMode")
此行不是用于设置 Userdefaults,而是获取 UserDefaults。由于您在设置默认值之前使用它,因此它不会反映正确的分段选择。所以你的设置部分是正确的,你应该只在你设置它之后获取值。
同样在您的 entryViewController 中,不要从 settingVC 中使用它,而是执行以下操作 -
//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 次 lightMode
值,所以您没有反映对变量的更改,因此它将始终是该值
要始终获取最新值,请使用:
let lightMode: Bool {
get {
return UserDefaults.standard.bool(forKey: "lightMode")
}
}
另外,你应该在更改值后立即调用颜色更改
我假设您正在 return 从您的 settingsViewController
连接到您的 entryViewController
;由于您正在 returning 到现有的视图控制器实例,因此当您 return.
viewDidLoad
中的代码不会执行
将代码移至viewWillAppear
;这样你的代码将在视图控制器出现之前执行,即使你 return 到现有实例:
func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let lightMode = UserDefaults.standard.bool(forKey: "lightMode")
if lightMode == false {
Colours.darkMode()
}
}