我试图在我的列表中实现批量删除,我的代码有点像这样。
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()
}
它现在有效,但原始代码不应该有效吗?
答案 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
}
}
}