删除带有动画的行后更新表视图的最佳方法?

问题描述

我有一个标签显示单元格索引的表格视图,因此表格视图可能类似于:

0
1
2
3
4

我想让用户使用以下方法删除带有动画的单元格:

tbl.deleteRows(at: [IndexPath(row: idx,section: 0)],with: .automatic)

但问题是,其他单元格在动画播放后不会更新它们的索引标签。因此,例如,如果我删除了索引 1,那么在删除动画完成后,表格最终看起来像:

0
2
3
4

删除动画之后重新加载表格视图的最佳方法是什么,因为 deleteRows 没有完成回调?

我对仅调用 tbl.reloadData() 代替 tbl.deleteRows(...) 不感兴趣,因为我对删除动画感兴趣。

谢谢

解决方法

您可以使用 performBatchUpdatesUITableView 并在完成后更新其他行:

tbl.performBatchUpdates({
    self.tbl.deleteRows(at: [IndexPath(row: idx,section: 0)],with: .automatic)
},completion: { (done) in
    let indexPathsToUpdate = (idx...self.tbl.numberOfRows(inSection: 0)).map { IndexPath(row: $0,section: 0) }
    self.tbl.reloadRows(at: indexPathsToUpdate,with: .none)
})

或者也可以使用 beginUpdatesendUpdates 执行这些操作并且动画会同时发生:

let indexPathsToUpdate = (idx+1...tbl.numberOfRows(inSection: 0)).map { IndexPath(row: $0,section: 0) }
tbl.beginUpdates()
tbl.deleteRows(at: [IndexPath(row: tbl,with: .automatic)
tbl.reloadSections(IndexSet(integersIn: 0...0),with: .none)
tbl.endUpdates()

请注意,我按照建议将 reloadRows(at: indexPathsToUpdate,with: .none) 与动画 .none 一起使用,但这取决于您希望它们更新的方式,是否使用某些动画。