Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 删除行后更新indexPath值_Swift_Uitableview_Asynchronous - Fatal编程技术网

Swift 删除行后更新indexPath值

Swift 删除行后更新indexPath值,swift,uitableview,asynchronous,Swift,Uitableview,Asynchronous,我有一张最喜欢的电影的清单。在表格单元格中,有一个按钮用于从收藏夹列表中删除电影。所以我想用tableView.deleteRows设置动画。但是如果我从屏幕顶部删除一行,其他行就会向上移动。这是正常的,但是当我从屏幕顶部删除行时,列表中已经显示的其他单元格没有更新。我为tableView.reloadData分配了一个asyncAfter方法来解决这个问题,但我认为这可能会在操作系统端造成崩溃。因为我在延迟后强制主线程重新加载数据。这真的是操作系统的问题吗?我该怎么办 问题示例: 如果我删除索

我有一张最喜欢的电影的清单。在表格单元格中,有一个按钮用于从收藏夹列表中删除电影。所以我想用tableView.deleteRows设置动画。但是如果我从屏幕顶部删除一行,其他行就会向上移动。这是正常的,但是当我从屏幕顶部删除行时,列表中已经显示的其他单元格没有更新。我为tableView.reloadData分配了一个asyncAfter方法来解决这个问题,但我认为这可能会在操作系统端造成崩溃。因为我在延迟后强制主线程重新加载数据。这真的是操作系统的问题吗?我该怎么办

问题示例:

如果我删除索引为0的电影,所有的电影都会向上。所以在删除之前,1索引电影应该有0索引,但它不是。如果我尝试删除一个新的0索引电影,它将删除另一个电影

这是我的代码//这是工作,但我认为异步后是一个问题

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)
}
不需要(丑陋的)延迟和(无意义的)重新加载


还请注意,我删除了
delete
行中的
self
,因为tableView实例可用作方法参数。

是否在
tableView.deleteRows
之前从数据源数组中删除该项?@Jithin yes favoriteShandler.shared.deleteMovie(movie)从ArraI中删除电影我想您在捕获索引路径时可能出了问题。@在tableView cellForRowAt indexPath中查看这段代码,我认为soI不会,这正是问题所在。请看我的答案。非常感谢。你能解释一下为什么捕获的文件不能正常工作吗?这是我在Swift的第二周:)是的,术语捕获包含了解释。在分配闭包时,索引路径被冻结,不再更改。这会导致意外的行为。如果我没有弄错的话,使用cellForRowAt indexPath在单元格关闭时更新。但是使用闭包时,我在使用deleteButton时传递了它。我真的很感激你。非常感谢您的帮助。
cellForRow
delete-/insertRows