如果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")
}
我真的不确定如何实施它?我在哪里用它?它做了什么?
知道什么是错的吗?
答案 0 :(得分:4)
这样就足够了:
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.count == 0 {
print("Favorites is empty")
} else {
print("Favorites is not empty, it has \(favorites.count) items")
}
} else {
print("Favorites is nil")
}
答案 1 :(得分:0)
设置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")
}
答案 2 :(得分:0)
好的,Rashwan L为我解决了这个问题。事情是,我的代码(和其他人建议的代码)检查userDefault是否存在 - 它没有打扰是否存储了值。要解决这个问题,我必须测试favExist.count == 0是否为真。如果为true,则阻止用户访问页面并阻止其访问其余代码。见下文:
if let favExist = UserDefaults.standard.array(forKey: "favorites") {
if(favExist.count == 0)
{
navigationController?.popToRootViewController(animated: true)
return
}
}else {
navigationController?.popToRootViewController(animated: true)
return
}
答案 3 :(得分:0)
您确实这样:
if UserDefaults.standard.array(forKey: "favs") != nil {
// userDefault has a value
} else {
// userDefault is nil (empty)
}