表视图中的索引超出范围:在表视图中批量删除后的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 绑定

MySQL笔记--- 创建表;插入,修改,删除数据;主键,外键约束;事务;索引;视图;三范式;

在获取数据期间索引超出部分中的行数范围

当我使用单元格时索引超出范围(Swift)

表格视图单元格中的 uicollectionview 出现错误:索引超出范围,为啥?