调用 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]()
希望这会有所帮助。
谢谢大家。在将其再次设置到我的阵列之前,我尝试取消存档并且成功了。
我在 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]()
希望这会有所帮助。
谢谢大家。在将其再次设置到我的阵列之前,我尝试取消存档并且成功了。