问题描述
我有一个在标签中显示单元格索引的表格视图,因此表格视图可能类似于:
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(...)
不感兴趣,因为我对删除动画感兴趣。
谢谢
解决方法
您可以使用 performBatchUpdates
的 UITableView
并在完成后更新其他行:
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)
})
或者也可以使用 beginUpdates
和 endUpdates
执行这些操作并且动画会同时发生:
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
一起使用,但这取决于您希望它们更新的方式,是否使用某些动画。