微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我如何启用滑动删除而不导致 NSInternalInconsistencyException?

如何解决我如何启用滑动删除而不导致 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

,

不要同时调用 deleteRowsreloadData。第一个创建增量更改;第二个扔掉所有东西并重新加载整个表。在事件循环结束时,它尝试应用 deleteRows 操作,并发现行数没有改变(因为您已经重新加载了表格)。

摆脱对 reloadData 的调用。


您注意到即使删除 reloadData 也不会改变行为。这表明您的 numberOfRowsInSection: 方法返回了错误的行数。调用 deleteRows 后,表视图期望调用 numberOfRowsInSection 的结果更小,但在您的情况下,它是相同的值 (7)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。