Swift:如何检查 UserDefaults 是不是存在,如果不保存选择的标准值?

Posted

技术标签:

【中文标题】Swift:如何检查 UserDefaults 是不是存在,如果不保存选择的标准值?【英文标题】:Swift: How to check if UserDefaults exists and if not save a chosen standard value?Swift:如何检查 UserDefaults 是否存在,如果不保存选择的标准值? 【发布时间】:2018-05-14 20:46:32 【问题描述】:

我正在尝试检查 UserDefaults Key 是否存在,如果没有将其设置为我选择的标准值,但这里关于堆栈溢出的答案并没有帮助我完成这项工作。

基本上我有几个 UISwitch,一个打开,其余的从一开始就设置为关闭。现在我的问题是,当加载 viewController 并且这些键不存在时,我不知道如何将这些初始状态保存到 UserDefaults 中。

这就是我尝试检查 UISwitch 的键是否存在以及如果不将其设置为 true(因为这是我想要的状态)然后再次检查键的 bool 是什么并设置 UISwitch到它(这在 viewController 再次打开时非常重要):

func setupSwitches() 
    let defaults = UserDefaults.standard

    //check if the key exists 
    if !defaults.bool(forKey: "parallax") 
        switchParallax.setOn(true, animated: true)
     

    //check for the key and set the UISwitch
    if defaults.bool(forKey: "parallax") 
        switchParallax.setOn(true, animated: true)
     else 
        switchParallax.setOn(false, animated: true)
     


当用户按下相应按钮时,我将 UserDefaults 键设置为:

@IBAction func switchParallax_tapped(_ sender: UISwitch) 
    let defaults = UserDefaults.standard

    if sender.isOn == true 
        defaults.set(true, forKey: "parallax")
     else 
        defaults.set(false, forKey: "parallax")
    

这显然是可行的,但问题出在上面的第一个代码中。

首先,我不确定如何检查它是否存在,如果不将其设置为“true”,并且由于该函数称为 setupSwitches(),它会在每次显示 viewController 时运行。

所以我不知道是否有更好的方法(例如,由于内存问题)来检查密钥是否存在,如果不将其设置为 true,并且如果它已经存在,则从 UserDefaults 获取 bool 并设置切换到正确的状态。

【问题讨论】:

【参考方案1】:

问题是您无法确定 UserDefaults.standard.bool(forKey: key) 是否存在。 UserDefaults.standard.object(forKey: key) 返回 Any? 所以你可以用它来测试 nil 例如

extension UserDefaults 

    static func exists(key: String) -> Bool 
        return UserDefaults.standard.object(forKey: key) != nil
    


【讨论】:

所以如果密钥存在,这个函数会返回 true,否则返回 false,对吧?所以在这种情况下,如果我得到一个 false 并且密钥不存在来保存值并设置 UISwitch 正确,我可以运行一个语句吗? 正确你的第一个问题,我没有按照第二个问题。您还可以删除 switchParallax_tapped() 方法中的 if 语句并使用 defaults.set(sender.isOn, forKey: "parallax") 谢谢这有点工作,我真的很喜欢设置 UserDefaults 的简短方法,但由于某种原因,它下次没有加载。这就是我所做的:parallax = UserDefaults.exists(key: "parallax") 并且因为我知道这将返回 true(如果密钥存在)或 false 如果不存在我检查 if parallax == false defaults.set(true, forKey: "parallax") 以正确设置它是否为 false(密钥不存在),然后我设置开关:switchParallax.setOn(parallax, animated: true)。但是现在加载视图时总是如此? 如果它总是正确的,那么你的IBAction switchParallax_tapped 就不会被调用。在defaults.set(false, forKey: "parallax") 处设置一个断点以确保它可以设置为false。一个已设置,它将保持设置,直到您的代码再次设置它或您删除应用程序。

以上是关于Swift:如何检查 UserDefaults 是不是存在,如果不保存选择的标准值?的主要内容,如果未能解决你的问题,请参考以下文章

UserDefaults swift作为数组检查值是不是存在

如何将 UserDefaults 添加到任务列表中 - Swift

如何使用 userDefaults 保存打印数组(swift 3)

如何将完整的 UserDefaults 列表放入 tableview - Swift 3

如何在 Swift 中实现一个管理 UserDefaults 的键值对的通用结构?

如何在 swift 中使用 UserDefaults 实现登录/注销导航?