CoreData 似乎保存了错误的变量

Posted

技术标签:

【中文标题】CoreData 似乎保存了错误的变量【英文标题】:CoreData seems to save wrong variable 【发布时间】:2016-11-02 22:29:00 【问题描述】:

我正在尝试调试以下代码。

1) CellClass有IBAction改变Bool值,声明为value的值:Bool

@IBAction func dashBrnPressed(_ sender: AnyObject) 
  value == true ? (value = false) : (value = true)
  NotificationCenter.default.post(name: .reload, object: nil)
                                      // reloads the TableView
 

2) 我使用 UITableView 控制器和 dequeueReusableCell 并获取 CoreData。这些行只对细胞负责。 "switchAction" 是来自 CoreData 的值

 if cell.value == true
     switchAction.isOn = true

  else
     switchAction.isOn = false

  

  DataBaseController.saveContext()
  cell.value = switchAction.isOn

  return cell

3) 除非我重新启动应用程序,否则它似乎可以正常工作。没有崩溃,但默认情况下它返回 FALSE 作为值。我需要根据按钮的语句将值 back 存储到 CoreData。

代码当然是简化了。

【问题讨论】:

尝试重命名您的属性。我已经看到以前的问题/答案表明 CoreData 与以“is....”开头的布尔属性名称作斗争。 重启后仍然返回 FALSE... 【参考方案1】:

我想我看到了问题所在。在第 2 部分下的代码块中,您正在执行以下操作:

    switchAction.isOn 设置为cell.value 的值 将switchAction.isOn保存到CoreData 将cell.value 设置为switchAction.isOn 的值

当您重新启动您的应用程序时,cell.value 默认为 false,然后您将该 false 覆盖到 switchAction.isOn 并将其保存回 CoreData。因此,即使 switchAction.isOn 可能加载了正确的值,您还是会在看到它之前将其覆盖。

你需要的是另一种方式的作业:

cell.value = switchAction.isOn

由于cell 是一个可重复使用的表格视图单元格,您可以将该行放在您的tableView(UITableView, willDisplay: UITableViewCell, forRowAt: IndexPath) 委托函数中,该函数在单元格显示之前被调用。

【讨论】:

是的,这将是最简单的方法..问题是单元格是 dequeueReusableCell 并且无法从 cellForRow 函数旁边的任何地方访问它:( 你是对的,即使重启后存储在核心数据中的值也是正确的。它覆盖了某个地方,这太糟糕了? @DanilMihnevich 抱歉,我错过了关于 dequeueReusableCell 的部分。您可以将该行放在您的 tableView(UITableView, willDisplay: UITableViewCell, forRowAt: IndexPath) 委托函数中。更新了答案以添加它。 谢谢!你的意思是把一种cell.value = true/false放入函数中吗?或者更具体的东西? 我的意思是把willDisplay.value = switchAction.isOn放到你的tableView(:willDisplay:forRowAt)函数中。这会将switchAction.isOn 的值转移到单元格的value,我认为这就是你想要做的。【参考方案2】:

原因仍然未知,但此代码有效

1) cell.value 现在是可选的,在重启应用时等于 nil

2) cellForRow 中的这段代码现在首先分配可选值,并且仅当值存在时才存储新值 3) 函数 willDisplay 不返回 UITableViewCell 并且不需要

 switch cell.value   
    case nil:

        if switchAction.dashboard == true
            cell.dashBtn.tintColor = .white
            cell.value = true

         else 

            cell.dashBtn.tintColor = myColors.opaceGrayColor
            cell.value = false
        

    case true?:

    switchAction.dashboard = true
    cell.dashBtn.tintColor = .white
    DataBaseController.saveContext()


    case false?:

    switchAction.dashboard = false
    cell.dashBtn.tintColor = myColors.opaceGrayColor
    DataBaseController.saveContext()

我很高兴,感谢您的帮助! :)

【讨论】:

以上是关于CoreData 似乎保存了错误的变量的主要内容,如果未能解决你的问题,请参考以下文章

保存到 CoreData 似乎有效,但它不是 Swift

数据导入CoreData期间如何显示progressBar?

保存期间CoreData比较错误

从 CoreData 获取数据时出现“'[AnyObject]' 不可转换为 '[Dog]?'”错误

认识CoreData—初识CoreData

ios coredata 会在新版本中更改实体属性导致崩溃