【发布时间】: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