删除部分中的最后一个单元格后iOS应用程序崩溃

时间:2016-10-16 16:46:56

标签: ios uitableview swift3

所以每当我尝试删除该部分的最后一个单元格时,我的应用程序都会崩溃。

例如,如果我的部分有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个部分,并且我删除了其中一个部分的全部内容,我应该删除一个部分并将其从数据源中删除。

2 个答案:

答案 0 :(得分:3)

问题是numberOfSections在删除行之前和之后返回不同的值,但您不删除任何部分。因此,您应该在numberOfSections中返回一个常量值,或者在deleteSections

之外调用deleteRows

要记住的主要内容如下:

UITableView必须始终包含与dataSource相同数量的行和部分。

您不能只在numberOfSectionsnumberOfRows dataSource方法中返回新值。应使用delete / insert rows(sections)方法补偿每个更改。反之亦然:如果删除/插入tableView,必须返回dataSource方法中的相应值。正如您的异常消息所述:

  

更新后表格视图中包含的部分数量   (1)必须等于表中包含的部分数   在更新(3)之前查看 ,加上或减去部分的数量   插入或删除(0已插入,0已删除)

这是因为3 + 0≠1。在这种情况下,您应该删除两个部分以避免崩溃。

答案 1 :(得分:1)

错误消息实际上非常有用。它讨论的是部分 - 它预计不会改变,但是在您的操作后它会找到不同的值。

基本上,在调用代码,运行代码,然后检查新数字是否与您的操作对齐之前,UIKit确实检查了部分和行的数量。在你的情况下,它没有 - 因为你正在调用deleteRows(这应该减少给定部分的行数),但是你的numberOfSections委托现在给出了不同的结果。因此,您要么致电deleteSections,要么保持sectionCount不被修改。

顺便说一句,不禁止将0作为一个部分的行数返回 - 也许这就是你想要的。

进一步说明:我不认为在实例变量中存储段数是一件好事。它可以实现双重记账。