我知道有很多关于此主题的帖子,我已经完成了大部分内容,但我仍然无法解决我在删除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]
}
这会从dataStore中正确删除项目。我在这里尝试了许多不同的解决方案,例如在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()
}
}
这里是翠鸟图书馆,因为如果删除了单元格,我想取消图像下载
我注意到的是,如果我使用
`tableView.dequeueReusableCell(withIdentifier: "Cell")`
而不是
tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
这不会崩溃,所以这可能是我的解决方案,但我很想知道这里有什么问题。我理解&#39; forIndexPath&#39;方法应该总是返回一个单元格,但在这种情况下因为零而崩溃。
我在另一个不依赖于didEndDisplaying:Cell方法的viewController中有相同的删除代码,这并没有崩溃
答案 0 :(得分:0)
您需要在didEndDisplaying中更改此行。你需要得到现有的细胞。
let cell = tableView.cellForRowAtIndexPath(indexPath)
答案 1 :(得分:0)
我有一个非常相似的问题。
请确保在删除单元格时,您的目标不是删除整个部分。我的tableView建立在不同长度的节上,而不是在行上。
我发现通过替换
tableView.deleteRows(at: [indexPath], with: .automatic
具有:
tableView.deleteSections(IndexSet(integer: indexPath.section), with: .automatic)
我能够解决该错误。 在实施此更改之前,请确保要删除整个部分!
希望这会有所帮助,加油:)