在 deleteRows 之后 TableView reloadData
Posted
技术标签:
【中文标题】在 deleteRows 之后 TableView reloadData【英文标题】:TableView reloadData right after deleteRows 【发布时间】:2020-08-29 10:49:04 【问题描述】:在我的tableView
中,我删除了一行,然后我需要重新加载整个表以重新计算一些值。最好的方法是什么?由于deleteRows
没有完成处理程序,并且根据SO 上的this comment,我不应该在删除一行后立即调用tableView.reloadData()
。
func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration?
let deleteAction = UIContextualAction(style: .normal, title: "Delete") [weak self] (action, view, completion) in
guard let weakSelf = self else return
CoreDataManager.manager.deleteActivity(activity: weakSelf.sortedActivites[indexPath.row])
weakSelf.sortedActivites.remove(at: indexPath.row)
tableView.deleteRows(at: [indexPath], with: .automatic)
tableView.reloadData()
completion(true)
deleteAction.backgroundColor = UIColor.red
return UISwipeActionsConfiguration(actions: [deleteAction])
【问题讨论】:
【参考方案1】:在您的情况下,仅调用 reloadData
就足够了。
如果您需要 deleteRows
的完成回调,您可能想尝试在 UIView.animate
块内使用 none
动画调用 deleteRows
。
UIView.animate(
withDuration: 0.2,
animations:
self.tableView.deleteRows(at: indexPaths, with: .none)
,
completion: _ in
self.tableView.reloadData()
)
【讨论】:
true,但是我没有删除动画。这不是一个大问题,但我只是对如何按照我描述的方式进行操作感兴趣【参考方案2】:一种可能的解决方案是使用UITableViewDiffableDataSource
。这是 Apple 在 ios 13 中向我们展示的新功能。使用此 API,您可以获得声明式编程所具有的一些巨大优势,并且可能会消除在许多不同应用中发现的一整类非常常见的错误。
如果您的应用是为 13.0+ 设备构建的,您可以尝试一下。这将为您处理删除、插入等操作。因此,您需要做的就是在您从 CoreDataManager
删除您的活动后立即创建一个新快照并将其应用到 dataSource
。
dataSource.apply (someSnapshot, animatingDifferences: true, Completion: nil)
【讨论】:
【参考方案3】:你试过reloadSections()
吗?
tableView.reloadSections(IndexSet(integersIn: 0...0), with: UITableView.RowAnimation.top)
【讨论】:
以上是关于在 deleteRows 之后 TableView reloadData的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript - 在最后一行的 deleteRow 之后,无法正确向上移动表格
如何使用 Swift 从 tableview 和 sqlite3 中删除
Mysql Java Derby Netbeans:不允许“deleteRow”,因为 ResultSet 不是可更新的 ResultSet