gpt4 book ai didi

ios - UITableView - 破坏性的 UIContextualAction 不重新加载数据

转载 作者:可可西里 更新时间:2023-10-31 23:57:31 25 4
gpt4 key购买 nike

我正在尝试使用 iOS 11 方式在表格 View 行中添加滑动操作。我想添加一个操作来删除一行。

我的测试 TableView 显示从 0 到 9 的数字,数据源是一个简单的整数数组,称为 numbers:

class ViewController: UIViewController {
var numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
}

当我选择一行时,我打印numbers的关联值:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print(numbers[indexPath.row])
tableView.deselectRow(at: indexPath, animated: true)
}

我实现了新的委托(delegate) trailingSwipeActionsConfigurationForRowAt 如下:

func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {

let delete = UIContextualAction(style: .destructive, title: "Delete") { (_, _, completionHandler) in
self.numbers.remove(at: indexPath.row)
completionHandler(true)
}

return UISwipeActionsConfiguration(actions: [delete])
}

当我在一行上滑动时,删除工作正常。但是,这就是我的问题,当我在删除后选择另一行时,关联的 IndexPath 是错误的......

示例:

  • 我选择第一行,打印的值为0:OK。
  • 我删除了第一行。
  • 我选择新的第一行,打印的值为2,因为传入参数的IndexPath是第1行,而不是第0行:不行。

我做错了什么?

最佳答案

重要的是要记住,在您的案例中有一个模型(numbers 数组)和一个 View (显示的单元格)。当您从 numbers 中删除元素时,您只是在更新模型。

在大多数情况下,当您对其进行编码时,您很快就会收到错误消息,因为模型与 View 不同步。

但是,我的测试表明,当样式为 .destructive 并且您将 true 传递给 completionHandler 时,Apple 会删除行你。这就是为什么您看到该行消失的原因。但是有些地方不太对劲,我找不到任何关于它的文档。

与此同时,只需执行以下操作:

self.numbers.remove(at: indexPath.row)
tableView.deleteRows(at: [indexPath], with: .automatic)
completionHandler(true)

永远记住,如果您更改了模型,则需要更新 View 。

关于ios - UITableView - 破坏性的 UIContextualAction 不重新加载数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46714155/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com