如何解决删除行后更新indexPath值
我有一个喜欢的电影列表。在表格单元格中,有一个按钮用于从“收藏夹”列表中删除电影。所以我想用tableView.deleteRows对其进行动画处理。但是,如果我从屏幕顶部删除一行,则其他行向上。这是正常现象,但是当我从屏幕顶部删除该行时,列表中已经显示的其他单元格没有更新indexPath。我为tableView.reloadData分配了asyncAfter方法来解决此问题,但我认为这可能会导致OS崩溃。因为我强迫主线程在延迟后重新加载数据。这对OS真的有问题,我该怎么办?
示例问题:
如果我删除索引为0的电影,则所有上升的电影。因此,在删除之前,1个索引的影片应具有0个索引,但没有。如果我尝试删除一个新的0索引电影,它将删除另一部电影。
Work example without tableView.reloadData()
这是我的代码//工作正常,但我认为asyncAfter是一个问题
cell.deleteButtonActionBlock = {
FavouritesHandler.shared.deleteMovie(movie)
self.tableView.deleteRows(at: [indexPath],with: .automatic)
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
self.tableView.reloadData()
}
}
解决方法
如果可以删除,插入或移动单元格,则绝对不能使用捕获的索引路径。
在自定义单元格中声明闭包
var deleteButtonActionBlock : ((UITableViewCell) -> Void)?
并调用它
deleteButtonActionBlock?(self)
在cellForRow
中获取单元格的实际索引路径
cell.deleteButtonActionBlock = { aCell in
let actualIndexPath = tableView.indexPath(for: aCell)!
FavouritesHandler.shared.deleteMovie(movie)
tableView.deleteRows(at: [actualIndexPath],with: .automatic)
}
没有(很丑陋的)延迟,也不需要(毫无意义的)重新加载。
请注意,由于tableView实例可用作方法参数,因此我在self
行中删除了delete
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。