Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 数据更改后更新tableViewCells属性_Ios_Swift_Swift3 - Fatal编程技术网

Ios 数据更改后更新tableViewCells属性

Ios 数据更改后更新tableViewCells属性,ios,swift,swift3,Ios,Swift,Swift3,我在tableViewController中显示了一系列清单项目。每个项目都包含在tableViewCell中,选中项目时,该单元格的背景色将从白色变为绿色。我可以按预期选中和取消选中项目以及单元格的颜色更改 我添加了一个重置按钮,将所有项目更改为未选中状态。我测试了重置功能,项目正在重置,但是tableViewCells没有更新到正确的颜色,它们保持在最后的状态。我试过使用 tableView.reloadData() 及 但这似乎对细胞没有任何影响 我的重置功能位于模型中: func re

我在tableViewController中显示了一系列清单项目。每个项目都包含在tableViewCell中,选中项目时,该单元格的背景色将从白色变为绿色。我可以按预期选中和取消选中项目以及单元格的颜色更改

我添加了一个重置按钮,将所有项目更改为未选中状态。我测试了重置功能,项目正在重置,但是tableViewCells没有更新到正确的颜色,它们保持在最后的状态。我试过使用

tableView.reloadData()

但这似乎对细胞没有任何影响

我的重置功能位于模型中:

func resetCheckedStatus(for items: [Item]) -> [Item] {
  var resetItems: [Item] = []

  for item in items {
      item.isChecked = false
      resetItems.append(item)
  }
  return resetItems
}
我在tableViewController中的重置操作

    @IBAction func resetItems(_ sender: Any) {

    let title = "Reset Items"
    let message = "Are you sure you want to reset all items to unchecked status?"

    let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
    let okAction = UIAlertAction(title: "OK", style: .default, handler: {action in self.items = resetCheckedStatus(for: self.items)} )
    let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)

    alert.addAction(cancelAction)
    alert.addAction(okAction)

    present(alert, animated: true, completion: nil)
    self.tableView.reloadData()

    if let indexPaths = self.tableView.indexPathsForVisibleRows {
        tableView.reloadRows(at: indexPaths, with: .automatic)
    }
}

更改项目数组后,需要重新加载表视图。将重载表视图代码移动到okAction的处理程序块中,如下所示

let okAction = UIAlertAction(title: "OK",  
                             style: .default, handler{action in
                            self.items = resetCheckedStatus(for: self.items)
                                         self.tableView.reloadData()} )

更改项目数组后,需要重新加载表视图。将重载表视图代码移动到okAction的处理程序块中,如下所示

let okAction = UIAlertAction(title: "OK",  
                             style: .default, handler{action in
                            self.items = resetCheckedStatus(for: self.items)
                                         self.tableView.reloadData()} )

你需要发布你的
cellForRow(在:)
方法。我的猜测是,你没有完全配置你的细胞后,回收它们。请记住,退出队列的单元格可以保持上次使用时的状态,包括对其背景颜色的更改。您不能假设它将处于默认状态。您需要发布
cellForRow(at:)
方法。我的猜测是,你没有完全配置你的细胞后,回收它们。请记住,退出队列的单元格可以保持上次使用时的状态,包括对其背景颜色的更改。你不能假设它将处于默认状态。就是这样!请详细说明为什么需要在处理程序块中调用reloadData(),而不是在之后调用?只有在点击警报上的“确定”按钮后,才会调用处理程序闭包。闭包是一个自包含的功能块,虽然它们看起来是内联的,但实际上并不是按顺序执行的。因此,在您的示例代码中,即使在模型对象被resetCheckedStatus方法修改之前,表视图也将重新加载!请详细说明为什么需要在处理程序块中调用reloadData(),而不是在之后调用?只有在点击警报上的“确定”按钮后,才会调用处理程序闭包。闭包是一个自包含的功能块,虽然它们看起来是内联的,但实际上并不是按顺序执行的。因此,在示例代码中,即使在resetCheckedStatus方法修改模型对象之前,表视图也将重新加载。