1

我知道有很多关于这个主题的帖子,我已经阅读了其中的大部分,但我仍然无法解决我在删除 tableViewCell 时遇到的问题,导致我的应用程序因以下错误而崩溃:

Assertion failure in -[UITableViewRowData rectForRow:inSection:heightCanBeGuessed:] Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'request for rect at invalid index path (<NSIndexPath: 0xc000000000000016> {length = 2, path = 0 - 0})'

我使用明确设置行的高度

tableView.rowHeight = 140

我的删除代码如下

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {

    let deleteAction = UITableViewRowAction(style: .destructive, title: "Delete") { (action, indexPath) in
        let object = self.datastore[indexPath.row]

        do {
            try self.realm?.write {
                self.realm?.delete(object)

                    self.datastore.remove(at: indexPath.row)
                    self.tableView.deleteRows(at: [indexPath], with: .none)
            }

        } catch let error {

        }
    }
    deleteAction.backgroundColor = .red

    return [deleteAction]
}

这确实会从数据存储中正确删除该项目。我在这里尝试了许多不同的解决方案,例如在 mainThread 上调用 delete,重新加载整个 dataSource 等,但它仍然崩溃。

我的numberOfRowsInSection方法被调用并在删除后返回正确的行数,因此这似乎不是问题。

添加一个通用异常断点虽然我认为它在这里崩溃了

      func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as? Cell {
        cell.image.kf.cancelDownloadTask()
    }
}

kf 这里是翠鸟库,因为如果单元格被删除,我想取消图像下载

我注意到的是,如果我使用

  `tableView.dequeueReusableCell(withIdentifier: "Cell")`

代替 tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)

这不会崩溃,所以这可能是我的解决方案,但我很想了解这里出了什么问题。我知道'forIndexPath' 方法应该总是返回一个单元格,但在这种情况下由于零而崩溃。

我在另一个不依赖 didEndDisplaying:Cell 方法的 viewController 中有相同的删除代码,这不会崩溃

4

2 回答 2

0

我有一个非常相似的问题。

确保在删除单元格时,您的目标不是删除整个部分。我的 tableView 建立在不同长度的部分而不是行上。

我发现通过替换

tableView.deleteRows(at: [indexPath], with: .automatic

和:

tableView.deleteSections(IndexSet(integer: indexPath.section), with: .automatic)

我能够修复错误。但是,在实施此更改之前,请确保您要删除整个部分!

希望这会有所帮助,干杯:)

于 2018-07-11T16:54:57.490 回答
0

您需要在 didEndDisplaying 中更改此行。你需要得到现有的细胞。

let cell = tableView.cellForRowAtIndexPath(indexPath) 
于 2017-04-20T09:29:46.970 回答