Tableview 删除行和节

Tableview deleting rows and sections

我已经实现了以下删除机制:在删除操作时,tableView 会删除 selected 行,如果部分没有任何行,它将被删除。

我的机制是这样的:

guard let selectedRows = self.tableView.indexPathsForSelectedRows,
      let indexPath = self.tableView.indexPathForSelectedRow else { return }
                
self.tableView.beginUpdates()
self.dataSource[indexPath.section].rows.remove(at: indexPath.item)
                
if self.dataSource[indexPath.section].rows.isEmpty {
    self.dataSource.remove(at: indexPath.item)
    self.tableView.deleteSections(IndexSet(arrayLiteral: indexPath.section), with: .fade)
}
                
self.tableView.deleteRows(at: selectedRows, with: .fade)
self.tableView.endUpdates()

我的数据源对象:

struct DataSource {
    var section:String
    var rows:[Row]
}

struct Row {
    var data:String
}

问题是当我 select 多行并尝试删除 select 行时我迷上了以下消息:

Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (5) must be equal to the number of rows contained in that section before the update (6), plus or minus the number of rows inserted or deleted from that section (0 inserted, 2 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).'

当我删除一行时,我的机制工作正常,正如预期的那样。甚至删除一个空白部分。任何想法,我错在哪里?非常感谢。

解决方法:添加倒排的indexPath数组即可。 let invertedIndexPathes = selectedRows.sorted(by: >)

固定机制:

guard let selectedRows = self.tableView.indexPathsForSelectedRows,
       let indexPath = self.tableView.indexPathForSelectedRow else { return }

let invertedIndexPathes = selectedRows.sorted(by: >)
self.tableView.beginUpdates()
            
for itemIndexPath in invertedIndexPathes {
    self.dataSource[itemIndexPath.section].rows.remove(at: itemIndexPath.row)
    self.tableView.deleteRows(at: [itemIndexPath], with: .fade)
    self.tableView.reloadData()
}
            
if self.dataSource[indexPath.section].rows.isEmpty {
    self.dataSource.remove(at: indexPath.item)
    self.tableView.deleteSections(IndexSet(arrayLiteral: indexPath.section), with: .fade)
}
            
self.tableView.endUpdates()