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 删除该行后工作正常。
启动一个使用 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 删除该行后工作正常。