我看到的问题是,当我使用.destructive
和 pass true
在completionHandler
中创建一个UIContextualAction
时,似乎有一个删除行的默认操作。
如果您从Xcode的模板创建一个新的Master-Detail应用程序,并在MasterViewController
中添加此代码...
override func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
let testAction = UIContextualAction(style: .destructive, title: "Test") { (_, _, completionHandler) in
print("test")
completionHandler(true)
}
return UISwipeActionsConfiguration(actions: [testAction])
}
您滑动的行将被删除。注意,这里没有更新表视图的代码。此外,模型不会更新,如果您向上滚动以重新加载行,它将重新出现。
在这种情况下,传递false
不会删除该行。或者使用.normal
样式和true
也不会删除行。
默认情况下,.destructive
和true
会导致该行被删除。
有人能解释这种行为吗?为什么要删除该行?
发布于 2019-08-28 13:02:14
我不能在iOS 13中重现这个问题。iOS 12和之前版本的行为要么是一个bug,要么只是被撤回了(可能是因为它令人困惑)。
在iOS 13中,如果您只是从.destructive
操作返回,调用completion(true)
而不执行任何操作,则什么也不会发生,事情就到此为止了。不会为您删除单元格。
发布于 2019-04-29 06:06:02
我同意Kris Gellci的回答,但请注意,如果您使用的是NSFetchedResultsController,可能会使事情变得复杂。似乎对于破坏性的UIContextualAction,调用completion(true)
将删除该行,但NSFetchedResultsController的委托也是如此。因此,您很容易以这种方式结束错误。使用NSFetchedResultsController时,我决定调用completion(false)
(使上下文菜单关闭),而不管操作是否成功,然后让委托在相应对象已被删除的情况下删除表行。
https://stackoverflow.com/questions/47106002
复制相似问题