如何解决在deleteRows
在我的tableView
中,我删除了一行,然后立即需要重新加载整个表以重新计算一些值。最好的方法是什么?由于deleteRows
没有完成处理程序,并且根据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])
}
解决方法
在您的情况下,仅致电deleteRows
就足够了。
如果您需要deleteRows
的完成回调,则可能希望尝试在none
块内以UIView.animate
动画调用UIView.animate(
withDuration: 0.2,animations: {
self.tableView.deleteRows(at: indexPaths,with: .none)
},completion: { _ in
self.tableView.reloadData()
})
。
{{1}},
一种可能的解决方案是使用UITableViewDiffableDataSource
。这是Apple在iOS 13中向我们展示的新事物。有了此API,您将获得声明式编程所带来的巨大好处,并且有可能消除在许多不同应用中发现的一类非常常见的错误。
如果您的应用是为13.0+设备构建的,则可以尝试一下。这将为您处理诸如删除,插入等操作。因此,您要做的就是在从CoreDataManager
删除活动并将其应用于dataSource
之后立即创建一个新的快照。>
dataSource.apply (someSnapshot,animatingDifferences: true,Completion: nil)
您尝试过reloadSections()
吗?
tableView.reloadSections(IndexSet(integersIn: 0...0),with: UITableView.RowAnimation.top)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。