用户默认值仅在重启时工作

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()

我 运行 遇到的问题是,出于某种原因,我的应用程序仅在我重新启动后才更改其配色方案。也就是说,如果用户选择 colourSegmentdarkIndex,应用程序只会在我重新启动后更新颜色。我想知道解决这个问题的方法是什么。

问题在行 -

//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()
    }
}