调用 awakeFromNib 时 UserDefaults return 0 个元素

UserDefaults return 0 elements when call in awakeFromNib

我在 UITableViewCell 中有一个 UICollectionView,我正在使用 UserDefaults 将所选项目的数组保存在 didSelectItem 函数中,以便在关闭父视图控制器后保持所选状态其中:

var arrSelectedIndex = [IndexPath]()
let encodedData = NSKeyedArchiver.archivedData(withRootObject: arrSelectedIndex)
UserDefaults.standard.set(encodedData, forKey: "arrayOfSelectedItem")
UserDefaults.standard.synchronize()

每当我显示视图控制器时,我都会在 awakeFromNib 中再次使用 UserDefaults 设置我的数组:

arrSelectedIndex = UserDefaults.standard.array(forKey: "arrayOfSelectedItem") as? [IndexPath] ?? [IndexPath]()

但是我的数组和 UserDefaults return 0 个元素(我试图打印出 arrSelectedIndex 和 UserDefaults.standard.array(forKey: "arrayOfSelectedItem") as? [IndexPath] ?? [IndexPath]() 的值)并且它们都是 0,即使它们在选择项目时有数据。 awakeFromNib 是否会重置其中的所有内容?

问题出在这一行:

UserDefaults.standard.array(forKey: "arrayOfSelectedItem") as? [IndexPath]

那会失败,因为你在那个键下保存的不是数组。这是您之前所说的:

let encodedData = NSKeyedArchiver.archivedData(withRootObject: arrSelectedIndex)
UserDefaults.standard.set(encodedData, forKey: "arrayOfSelectedItem")

您保存的是encodedData。它不是数组。它是一个数据。该数组在其中编码。

首先是将列表保存在 userDefault 中,没有必要将其存档,如果包含基本数据类型则可以。 其次,如果在将列表保存到 UserDefault 之前将其存档,则必须取消存档编码数据才能获取列表。

方法在这里,

data = UserDefaults.standard.data(forKey: "arrayOfSelectedItem") as? Data
arrSelectedIndex = NSKeyedUnarchiver.unarchiveObject(with: data) as? [IndexPath] ?? [IndexPath]()

希望这会有所帮助。

谢谢大家。在将其再次设置到我的阵列之前,我尝试取消存档并且成功了。