Xcode 11 个 tableview 在启动时崩溃

Xcode 11 tableview crashes on launch

启动一个使用 tableview 的应用程序,模拟器在启动时崩溃,原因是:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Attempted to call -cellForRowAtIndexPath: on the table view while it was in the process of updating its visible cells, which is not allowed.

完全相同的代码在 iOS 12 / Xcode 10.2.

注释掉下面突出显示的函数调用解决了崩溃问题:

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    updateRowHeight(indexPath: indexPath) // CRASH IS BECAUSE OF CALLING THIS HERE
    return myTableView.frame.height / CGFloat(CellsDataEnum.allCases.count)
}


func updateRowHeight(indexPath: IndexPath) { // WHICH CALLS THIS
     myTableView.cellForRow(at: indexPath)?.textLabel?.font = UIFont.systemFont(ofSize: myTableView.frame.height / 10)
}

相反,我现在将字体设置为 cellForRowAt:

cell.textLabel?.font = UIFont.systemFont(ofSize: myTableView.frame.height / 10)

为什么第一个版本在 iOS 12 中运行,但在 iOS 13 中崩溃?

无需从 heightForRowAt 调用 updateRowHeight。事实上,应该删除整个 updateRowHeight 方法。在cellForRowAt.

中设置字体

鉴于您的 heightForRowAt 为所有行返回相同的值,请也删除该方法。这是非常低效的。只需将 table 视图的 rowHeight 属性 设置一次到所需的高度。

这些更改应该适用于所有 iOS 版本,并且效率更高。

iOS 13 可能有问题,因为您在更新 table 视图时尝试访问单元格。它可能在以前的版本中有效,但从 heightForRowAt.

访问 cellForRowAt 从来都不是一个好主意

(Apple 通过反馈助手)

  • This exception is new in iOS 13 and occurs if you attempt to ask the table view to return a cell while the table view is in the middle of updating its cells.
  • You can learn more about this on the Developer Forums here: https://forums.developer.apple.com/thread/117537#364166

与我的情况非常相似的问题,通过避免这一行解决:

 table.numberOfRows(inSection: cells.count)

在更新单元格的过程中尝试向 table 视图询问 return 单元格数据会导致崩溃。 table 删除该行后工作正常。