【问题标题】:UserDefaults array is coming back emptyUserDefaults 数组返回为空
【发布时间】:2019-10-20 13:39:43
【问题描述】:

我正在尝试将对象数组设置为用户默认值,但没有追加。

声明数组的变量 在我的 AllFormulas 类中:

let defaults = UserDefaults.standard    
static var lineOne1 = UserDefaults.standard.array(forKey: "line1") as? [Formulas] ?? []
init() {
//formula names and values 

然后我从一个空数组开始

lineOne1 = []
}

附加到数组 在我的 AddViewController 类中:

 func lineOneAdd() {
    let line1 = lineOne1
    lineOne1.append(formulaAppend)
    defaults.set(line1, forKey: "line1")
    defaults.synchronize()

}

然后在视图中调用 userDefaults 确实加载了 MainViewController 类:

line1[indexPath.row] // as my cellForRowAt in tableView


print(line1)
//which prints : []

知道我做错了什么吗?提前致谢

【问题讨论】:

  • synchronize 的调用已过时。它应该被删除。
  • userDefaults 是全局的吗?当我调用 forKey: "line1" 时,我的 lineOne1 变量在另一个类中声明。这有关系吗?
  • 是的,对不起.. 我只是想简化它以方便。我没有指定,这是我的事
  • 我更新了我的问题以显示课程

标签: ios arrays swift nsuserdefaults


【解决方案1】:

您似乎附加到了错误的数组:

lineOne1.append(formulaAppend)

应该是:

line1.append(formulaAppend)

【讨论】:

  • 我试过了。但这就是当我调用该函数“***由于未捕获的异常'NSInvalidArgumentException'而终止应用程序时发生的情况,原因:'尝试为关键line1插入非属性列表对象(“MyProject.Formulas”)'
  • @MarkRogers 你的Formula 类是否实现(子类)Codable? rmaddy 也是正确的,你应该修改全局。
  • 不,公式没有子类。我有另一个文件 AllFormulas 类,然后我使用 init() 来声明每个公式值...在该类中,我还为 lineOne1 声明了我的数组。然后在 AddViewController 中,我选择要附加的公式并在 tableView 中的 MainViewController 上查看。
  • 如果你需要在 UserDefaults 中存储一个对象,我认为遵循Codable 是最佳实践。见this link。请注意,您通常应该使用 CoreData 来存储对象,而不是 UserDefaults,后者更常用于偏好设置。
  • 我确实先使用了 CoreData,但在表格视图中显示的公式存在问题。我开始认为 UserDefaults 可能是解决方案的一种更简单的方法
猜你喜欢
  • 2018-06-03
  • 1970-01-01
  • 2018-01-29
  • 1970-01-01
  • 1970-01-01
  • 2017-07-12
  • 1970-01-01
  • 2016-06-02
  • 2018-01-16
相关资源
最近更新 更多