在 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 之后,无法正确向上移动表格

UITableView deleterows 滚动到顶部

如何使用 Swift 从 tableview 和 sqlite3 中删除

deleteRow

Mysql Java Derby Netbeans:不允许“deleteRow”,因为 ResultSet 不是可更新的 ResultSet

jquery easyui里的datagrid删除行方法(deleteRow)怎么用