【问题标题】:How do I check if userDefault is empty?如何检查 userDefault 是否为空?
【发布时间】:2018-04-02 16:48:29
【问题描述】:

如果 userDefault 为空,我试图拒绝访问某个视图控制器,但代码似乎不起作用。为了更清楚一点,我将收藏列表保存到 userDefault。这是我的代码:

 if UserDefaults.standard.array(forKey: "favorites") == nil {

        navigationController?.popToRootViewController(animated: true)
        return
    }

错误是索引超出范围,这意味着整个块被忽略(此块之后的代码运行并且由于用户默认为空,因此在尝试检索不存在的信息时崩溃)。

有趣的是,代码在我第一次尝试进入 viewController 时有效(它拒绝我访问)。但是如果我收藏标记一个对象(保存到userDefault),然后取消收藏同一个对象(userDefault变为空),并进入viewController,程序崩溃。

我试过了:

if let favExist = UserDefaults.standard.array(forKey: "favorites") {
        print("")
        print("FAV EXISTS")
        print("")

    }else {
        print("")
        print("NOPE")
        print("")
        navigationController?.popToRootViewController(animated: true)
        return
    }

...同样的问题仍然存在。在 print() 中,在我最喜欢的标记之后,日志告诉我 FAV EXISTS,然后是不喜欢的标记,然后尝试访问该页面(即使 userDefault 现在应该为空)。

我也尝试过其他线程的代码。从另一个线程解决我的问题的建议代码是:

let defaults = UserDefaults.standard

    if (!defaults.bool(forKey: "favorites")) {
        defaults.set(true, forKey: "favorites")
    }

我不确定如何实现它?我在哪里使用这个?它有什么作用?

知道有什么问题吗?

【问题讨论】:

  • 你不是说if UserDefaults.standard.array(forKey: "favorites") != nil { 吗?如果根控制器需要存储在用户默认值中的数组,你应该检查它不是 nil
  • 您还应该看看 nil 合并运算符和注册默认值 developer.apple.com/documentation/foundation/userdefaults/…
  • 在使用下标访问其元素时,确保保存的数组有足够的元素。您应该始终使用其索引来迭代数组。 for index in yourArray.indices {或在使用该索引为数组下标之前检查 array.indices 是否包含该索引
  • 您应该编辑您的问题并显示它引发错误的代码

标签: swift userdefaults


【解决方案1】:

这样做就足够了:

if let favorites = UserDefaults.standard.array(forKey: "favorites") {
     // userDefault has a value
} else {
     // userDefault is nil (empty)
}

更新:
如果您的 arrat 也有任何值,您需要在 if 语句中进行检查:

if let favorites = UserDefaults.standard.array(forKey: "favorites") {
    print("Favorites exists")

    if favorites.isEmpty {
        print("Favorites is empty")
    } else {
        print("Favorites is not empty, it has \(favorites.count) items")
    }
} else {
    print("Favorites is nil")
}

【讨论】:

  • 谢谢,但它给了我同样的错误。查看更新的问题:)
  • @JoakimSjöstedt,检查我所做的更新。您还需要进行计数检查。
  • 太棒了,非常感谢,解决了我的问题!!! :) 正是我需要的。非常感谢! :)
【解决方案2】:

当您设置 UserDefaults 数组时,还将 BOOL 设置为 UserDefaults。当你恢复 Bool 时,即使没有设置它也不会崩溃。

var favouritesset = UserDefaults.standard.bool(forKey: "favoritesset")

if favouritesset == true {
//Then Recover the Array
var array = UserDefaults.standard.array(forKey: "favorites")
}

【讨论】:

  • array(forKey:) 已经返回一个可选值。为什么他需要一个不同的密钥来存储一个布尔值?
  • 我不明白。当favouriteset 为假时,它不会查找数组,当它为真时,它会查找。由于 bool 为真,因此必须设置数组。
【解决方案3】:

好的,Rashwan L 为我解决了这个问题。事情是,我的代码(以及其他人建议的代码)检查了 userDefault 是否存在 - 它不关心是否存储了一个值。为了解决这个问题,我必须测试 favExist.count == 0 是否为真。如果为真,则用户被阻止访问该页面并阻止访问其余代码。如下图:

if let favExist = UserDefaults.standard.array(forKey: "favorites") {
        if(favExist.count == 0)
        {
            navigationController?.popToRootViewController(animated: true)
            return
        }

    }else {
        navigationController?.popToRootViewController(animated: true)
        return
    }

【讨论】:

    【解决方案4】:

    你这样做:

        if UserDefaults.standard.array(forKey: "favs") != nil {
         // userDefault has a value
        } else {
         // userDefault is nil (empty)
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-15
      • 2020-05-29
      • 2016-04-05
      • 2018-01-08
      • 2020-09-25
      • 2012-01-15
      • 2016-07-16
      • 2021-08-14
      相关资源
      最近更新 更多