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期间如何显示progressBar?