我正在尝试调试以下代码。
1)CellClass有IBAction来改变Bool值,声明为值的值:Bool
@IBAction func dashBrnPressed(_ sender: AnyObject) {
value == true ? (value = false) : (value = true)
NotificationCenter.default.post(name: .reload, object: nil)
// reloads the TableView
}
2)我使用带有dequeueReusableCell的UITableView控制器并获取CoreData。这些细胞系仅对细胞有反应。 “switchAction”是CoreData的值
if cell.value == true{
switchAction.isOn = true
}else{
switchAction.isOn = false
}
DataBaseController.saveContext()
cell.value = switchAction.isOn
return cell
3)除非我重新启动应用程序,否则它似乎正常工作。没有崩溃,但默认情况下它返回值为FALSE。我需要将值返回存储到CoreData,具体取决于按钮的语句。
当然,代码已经简化了。
答案 0 :(得分:1)
我想我看到了问题。在第2部分的代码块中,您可以执行以下操作:
switchAction.isOn
设置为cell.value
switchAction.isOn
保存到CoreData cell.value
设置为switchAction.isOn
当您重新启动应用时,cell.value
默认为false,然后您将该错误覆盖到switchAction.isOn
并将其保存回CoreData。因此即使switchAction.isOn
可能正在加载正确的值,您也会在看到它之前覆盖它。
你需要的是另一种方式的任务:
cell.value = switchAction.isOn
由于cell
是一个可重复使用的表格视图单元格,因此您可以将该行放在tableView(UITableView, willDisplay: UITableViewCell, forRowAt: IndexPath)
委托函数中,该函数在显示单元格之前调用。
答案 1 :(得分:0)
原因仍然是不知道的,但这段代码有效
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()
}
我很高兴,谢谢你的帮助! :)