如何解决我如何启用滑动删除而不导致 NSInternalInconsistencyException?
当用户滑动删除时,我试图删除表格视图中的单元格,但每当我滑动以测试它是否删除时,我都会收到此错误:
由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无效更新:第 0 节中的行数无效。更新后现有节中包含的行数 (7) 必须等于行数更新前包含在该部分中 (7),加上或减去从该部分插入或删除的行数(0 插入,1 删除),加上或减去移入或移出该部分的行数(0 移入,0 移出)。'
这是我用来尝试从我的 firebase 数据库中删除信息并尝试在滑动时删除表格视图单元格的代码。
override func tableView(_ tableView: UITableView,commit editingStyle: UITableViewCell.EditingStyle,forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
guard let uid = Auth.auth().currentUser?.uid else { return }
guard let itemId = items[indexPath.item].itemId else { return }
USER_BAG_REF.child(uid).child(itemId).removeValue()
tableView.deleteRows(at: [indexPath],with: .fade)
tableView.reloadData()
} else if editingStyle == .insert {
// Create a new instance of the appropriate class,insert it into the array,and add a new row to the table view.
}
}
我该如何解决这个问题,以免收到 NSInternalInconsistencyException 并被删除?
从 firebase 中删除它的代码工作正常,它删除了我数据库中的记录,但在滑动删除时应用程序崩溃
解决方法
您已经从数据源数组中删除了该项目并且永远不会在 reloadData()
之后调用 insertRows/deleteRows
override func tableView(_ tableView: UITableView,commit editingStyle: UITableViewCell.EditingStyle,forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
guard let uid = Auth.auth().currentUser?.uid else { return }
guard let itemId = items[indexPath.item].itemId else { return }
USER_BAG_REF.child(uid).child(itemId).removeValue()
items.remove(at: indexPath.item)
tableView.deleteRows(at: [indexPath],with: .fade)
} else if editingStyle == .insert {
// Create a new instance of the appropriate class,insert it into the array,and add a new row to the table view.
}
}
是否有 removeValue()
的异步 API?如果是,请使用它并删除完成处理程序中的项目。
强烈建议选择 trailingSwipeActionsConfigurationForRowAt
而不是 commit editingStyle
不要同时调用 deleteRows
和 reloadData
。第一个创建增量更改;第二个扔掉所有东西并重新加载整个表。在事件循环结束时,它尝试应用 deleteRows
操作,并发现行数没有改变(因为您已经重新加载了表格)。
摆脱对 reloadData
的调用。
您注意到即使删除 reloadData
也不会改变行为。这表明您的 numberOfRowsInSection:
方法返回了错误的行数。调用 deleteRows
后,表视图期望调用 numberOfRowsInSection
的结果更小,但在您的情况下,它是相同的值 (7)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。