所以每当我尝试删除该部分的最后一个单元格时,我的应用程序都会崩溃。
例如,如果我的部分有10行,我可以毫无问题地删除它们,但最后一行会抛出以下错误:
由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'无效更新:无效的节数。更新后的表视图中包含的节数(1)必须等于更新前的表视图中包含的节数(3),加上或减去插入或删除的节数(插入0,0删除)。“
我在这里搜索并发现了一些方法来解决这个问题,但我尝试了所有这些并且无法修复此问题,它仍然会崩溃并抛出相同的错误。
我的代码的相关部分如下:
override func numberOfSections(in tableView: UITableView) -> Int {
if (main_arr.count > 0 && sub_arr.count > 0) {
self.numberOfSections = 3
} else {
self.numberOfSections = 2
}
return self.numberOfSections
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if (section == 0) {
return 1
} else if (section == 1 && main_arr.count > 0) {
return main_arr.count
} else {
return sub_arr.count
}
}
override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
return true
}
// Override to support editing the table view.
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
switch indexPath.section {
case 1:
main_arr.remove(at: indexPath.row)
case 2:
sub_arr.remove(at: indexPath.row)
default:
print("default 001")
}
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
}
}
编辑1
我试图处理全局变量,负责numberOfSections所以当我的任何arrays.count == 0时它会减少1,但它没有解决问题。
我完全理解错误信息,例如,如果我有3个部分,并且我删除了其中一个部分的全部内容,我应该删除一个部分并将其从数据源中删除。
答案 0 :(得分:3)
问题是numberOfSections
在删除行之前和之后返回不同的值,但您不删除任何部分。因此,您应该在numberOfSections中返回一个常量值,或者在deleteSections
deleteRows
要记住的主要内容如下:
UITableView必须始终包含与dataSource相同数量的行和部分。
您不能只在numberOfSections
或numberOfRows
dataSource方法中返回新值。应使用delete / insert rows(sections)方法补偿每个更改。反之亦然:如果删除/插入tableView,必须返回dataSource方法中的相应值。正如您的异常消息所述:
更新后表格视图中包含的部分数量 (1)必须等于表中包含的部分数 在更新(3)之前查看 ,加上或减去部分的数量 插入或删除(0已插入,0已删除)。
这是因为3 + 0≠1。在这种情况下,您应该删除两个部分以避免崩溃。
答案 1 :(得分:1)
错误消息实际上非常有用。它讨论的是部分 - 它预计不会改变,但是在您的操作后它会找到不同的值。
基本上,在调用代码,运行代码,然后检查新数字是否与您的操作对齐之前,UIKit确实检查了部分和行的数量。在你的情况下,它没有 - 因为你正在调用deleteRows
(这应该减少给定部分的行数),但是你的numberOfSections
委托现在给出了不同的结果。因此,您要么致电deleteSections
,要么保持sectionCount不被修改。
顺便说一句,不禁止将0
作为一个部分的行数返回 - 也许这就是你想要的。
进一步说明:我不认为在实例变量中存储段数是一件好事。它可以实现双重记账。