首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用户默认设置仅在重新启动时有效

用户默认设置仅在重新启动时有效
EN

Stack Overflow用户
提问于 2017-08-16 12:53:08
回答 3查看 829关注 0票数 1

我正在尝试在我的应用程序中实现一种明暗模式。在settingsViewController中,我有以下几行代码:

代码语言:javascript
复制
//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中,我有:

代码语言:javascript
复制
let lightMode = UserDefaults.standard.bool(forKey: "lightMode")

if lightMode == false {
    Colours.darkMode()
}

customisations()

我遇到的问题是,由于某些原因,我的应用程序只有在我重启它之后才会改变它的配色方案。也就是说,如果用户选择colourSegmentdarkIndex,应用程序只会在我重新启动后更新颜色。我想知道这个问题的解决方案是什么。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-08-16 12:58:22

问题出在队伍里-

代码语言:javascript
复制
//Sets user default for colour
let lightMode = UserDefaults.standard.bool(forKey: "lightMode")

这一行不是用来设置用户默认值的,而是用来获取UserDefaults的。因为您在设置默认值之前使用它,所以它不能反映正确的分段选择。因此,您的设置部分是正确的,您应该在设置之后才能获取该值。

同样,在你的entryViewController中,不要在settingsVC中使用它,而是执行以下操作-

代码语言:javascript
复制
//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()
票数 2
EN

Stack Overflow用户

发布于 2017-08-16 12:59:57

因为在初始化过程中只分配了一次lightMode值,所以没有反映出对变量的更改,所以它始终是该值

要始终获取最新的值,请使用以下命令:

代码语言:javascript
复制
let lightMode: Bool {
   get {
       return UserDefaults.standard.bool(forKey: "lightMode")
   }
}

此外,您应该在更改值之后立即调用颜色更改

票数 0
EN

Stack Overflow用户

发布于 2017-08-16 13:40:20

我假设您从settingsViewController返回到entryViewController;由于您返回到现有的视图控制器实例,因此返回时不会执行viewDidLoad中的代码。

将代码移到viewWillAppear;这样,即使您返回到现有实例,您的代码也将在视图控制器出现之前执行:

代码语言:javascript
复制
func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    let lightMode = UserDefaults.standard.bool(forKey: "lightMode")

    if lightMode == false {
        Colours.darkMode()
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45705328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档