SwipeCellKit删除tableView中的最后一行会产生错误

时间:2018-08-15 19:34:23

标签: swift uitableview

在tableView中删除一行直到最后一行都可以正常工作。 然后我崩溃了: “由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'无效的更新:第0节中的行数无效。更新(1)之后,现有节中包含的行数必须等于该段中包含的行数。更新前的那个部分(1),加上或减去从该部分插入或删除的行数(插入的0,删除1)和加上或减去移入或移出该部分的行数(移入的0,0搬出)。

我知道此功能中的单元格数量与预期的不同,并且与之不同:

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    if categoryArray?.count == 0 {  // <<-- i imagine this line cause problem, though deleting it will not let me show "no categories made yet" and while it would be better to use "if let" statement i make "array" in realm which never is nil as its being created with 0 elements(which is not nil) 
        return 1
    }

    return categoryArray?.count ?? 1
}

问题是我该如何以可以删除的方式实现此目的,而我仍然可以显示一种“替换”单元格,该单元格将显示而不是空的tableView。

这是整个删除功能:

扩展类别CategoriesViewController:SwipeTableViewCellDelegate {

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath, for orientation: SwipeActionsOrientation) -> [SwipeAction]? {
    guard orientation == .right else { return nil }

    let deleteAction = SwipeAction(style: .destructive, title: "Delete") { action, indexPath in

        do{
            try self.realm.write{
                self.realm.delete((self.categoryArray?[indexPath.row])!)
            }
        } catch {
            print("Error deleting category\(error)")
        }
    }

    return [deleteAction]
}

任何建议将不胜感激

2 个答案:

答案 0 :(得分:2)

您的问题似乎与您更新数据源的方式有关。首先,我建议不要在有0时人为地显示1个单元格。还有其他方法来显示空表视图(动态添加视图以显示表为空)。话虽如此,我将在您显示的tableView函数中更改您的代码。

其次,我看不到其余的代码,但看起来好像您正在从源中删除数据,但是您是否曾经刷新过支持表视图的本地数组?如果您不这样做,将会得到上面的错误。那么如何解决呢?

此处的关键是确保同时更新支持模型的数据以及驱动表视图的本地模型。

编辑 关于如何显示空表视图的问题,请尝试以下操作:

    override func numberOfSections(in tableView: UITableView) -> Int {
    let numOfSectons: Int = 1;
    if (itemStore.allItems.count>0){
        tableView.separatorStyle = .singleLine
        tableView.backgroundView = nil
    } else{
        let noDataFrame = CGRect(x: 0, y: 0, width: tableView.bounds.size.width, height: tableView.bounds.size.height)
        let noData: UILabel = UILabel(frame: noDataFrame)
        noData.text = "No Items!"
        noData.textColor = .black
        noData.textAlignment = .center
        tableView.backgroundView = noData
        tableView.separatorStyle = .none
    }
    return numOfSectons
}

在上面的示例中,支持tableView的模型是“ itemStore”。无论模型是否为空或是否从模型中删除项目,该项目都会在没有项目时自动显示。

答案 1 :(得分:0)

您只需要删除 TableView 中的最后一行并在领域块之后重新加载您的 tableView。

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: 
IndexPath, for orientation: SwipeActionsOrientation) -> [SwipeAction]? {
guard orientation == .right else { return nil }

let deleteAction = SwipeAction(style: .destructive, title: "Delete") { 
action, indexPath in

    do{
        try self.realm.write{
            self.realm.delete((self.categoryArray?[indexPath.row])!)
        }
    } catch {
        print("Error deleting category\(error)")
    }
   yourTableView.deleteRows(at: indexPath.row)
   yourTableView.reloadData()
    }

    return [deleteAction]
   }