表视图中的索引超出范围:在表视图中批量删除后的canEditRowAt
Posted
技术标签:
【中文标题】表视图中的索引超出范围:在表视图中批量删除后的canEditRowAt【英文标题】:Index out of range in tableView:canEditRowAt after batch delete In TableView 【发布时间】:2017-10-13 03:56:18 【问题描述】:我试图在我的列表中实现批量删除,我的代码有点像这样。
func deleteSelection()
var deletedIndexPaths: [IndexPath] = []
for (index, item) in self.itemsArray.enumerated().reversed()
if item.isSelected
self.itemsArray.remove(at: index)
deletedIndexPaths.append(IndexPath(row: index, section: 0))
if !deletedIndexPaths.isEmpty
self.tableView.deleteRows(at: deletedIndexPaths, with: .automatic)
func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool
return self.itemsArray[indexPath.row].isEditable
我在 tableview:canEditRowAt 中得到一个超出范围的索引 实现canEditRowAt时是否有适当的方法在tableView中批量删除
我当前的解决方案是在删除项目时删除行
func deleteSelection()
self.tableView.beginUpdates()
for (index, item) in self.itemsArray.enumerated().reversed()
if item.isSelected
self.itemsArray.remove(at: index)
self.tableView.deleteRows(at: IndexPath(row: index, section: 0), with: .automatic)
self.tableView.endUpdates()
它现在可以工作了,但原始代码不应该也可以工作吗?
【问题讨论】:
你从哪里得到错误?发布堆栈跟踪和代码。 【参考方案1】:第一种情况下的示例代码不起作用,因为您从未告诉 tableview 触发节和行计数方法。这是通过 beginUpdates 和 endUpdates 方法完成的,这就是您的第二个示例有效的原因。
func deleteSelection()
var deletedIndexPaths: [IndexPath] = []
tableView.beginUpdates()
for (index, item) in self.itemsArray.enumerated().reversed()
if item.isSelected
self.itemsArray.remove(at: index)
deletedIndexPaths.append(IndexPath(row: index, section: 0))
if !deletedIndexPaths.isEmpty
self.tableView.deleteRows(at: deletedIndexPaths, with: .automatic)
tableView.endUpdates()
此外,在 ios 11 中,Apple 引入了 performBatchUpdates(_:completion:) 为我们提供了一种方法方法,我们希望在一个动画操作中对表格视图进行多次更改,而不是几个单独的动画。您可以在 iOS 11 及更高版本上使用它。
func deleteSelection()
var deletedIndexPaths: [IndexPath] = []
for (index, item) in self.itemsArray.enumerated().reversed()
if item.isSelected
self.itemsArray.remove(at: index)
deletedIndexPaths.append(IndexPath(row: index, section: 0))
if !deletedIndexPaths.isEmpty
tableView.performBatchUpdates(
self.tableView.deleteRows(at: deletedIndexPaths, with: .automatic)
) (completed) in
【讨论】:
以上是关于表视图中的索引超出范围:在表视图中批量删除后的canEditRowAt的主要内容,如果未能解决你的问题,请参考以下文章
从数组中删除 - 致命错误:索引超出范围 - SwiftUI 绑定