用户默认仅在重新启动时工作

时间:2017-08-16 04:53:08

标签: ios swift nsuserdefaults

我正在尝试在我的应用程序中实现明暗模式。在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}},则应用程序仅在重新启动后更新颜色。我想知道这是什么解决方案。

3 个答案:

答案 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()
    }
}