6

如果 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")
    }

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

知道有什么问题吗?

4

4 回答 4

11

这样做就足够了:

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")
}
于 2017-10-22T06:18:54.567 回答
1

当您设置 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")
}
于 2017-10-21T20:40:53.447 回答
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
    }
于 2017-10-24T18:17:36.283 回答
0

你这样做:

    if UserDefaults.standard.array(forKey: "favs") != nil {
     // userDefault has a value
    } else {
     // userDefault is nil (empty)
    }
于 2019-06-24T07:30:09.180 回答