删除行后更新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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...