CoreData似乎保存了错误的变量

时间:2016-11-02 22:29:00

标签: ios swift uitableview core-data swift3

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

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,具体取决于按钮的语句。

当然,代码已经简化了。

2 个答案:

答案 0 :(得分:1)

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

  1. switchAction.isOn设置为cell.value
  2. 的值
  3. switchAction.isOn保存到CoreData
  4. cell.value设置为switchAction.isOn
  5. 的值

    当您重新启动应用时,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()
}

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