微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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 一起使用,但这取决于您希望它们更新的方式,是否使用某些动画。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。