tableView中的索引超出范围:批量删除后的canEditRowAt在TableView中

时间:2017-10-13 03:56:19

标签: ios swift uitableview tableview

我试图在我的列表中实现批量删除,我的代码有点像这样。

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 个答案:

答案 0 :(得分:-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

        }
    }
}