Xcode 11 tableview在启动时崩溃

时间:2019-06-05 03:30:29

标签: ios swift uitableview ios13

启动使用表格视图的应用程序时,模拟器会在启动时崩溃,并带有:

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中崩溃?

3 个答案:

答案 0 :(得分:0)

无需从updateRowHeight调用heightForRowAt。实际上,应该删除整个updateRowHeight方法。在cellForRowAt中设置字体。

考虑到您的heightForRowAt对于所有行都返回相同的值,请也删除该方法。这是非常低效的。只需将表格视图的rowHeight属性设置为所需的高度即可。

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

iOS 13可能有问题,因为您正在尝试在更新表视图时访问单元格。它可能在以前的版本中有效,但是从cellForRowAt访问heightForRowAt从来不是一个好主意。

答案 1 :(得分:0)

(Apple通过反馈助手)

  
      
  • 此异常是iOS 13中的新增异常,如果您试图在表视图正在更新其单元格的过程中尝试让表视图返回单元格,则会发生此异常。
  •   
  • 您可以在以下开发者论坛上了解有关此内容的更多信息:https://forums.developer.apple.com/thread/117537#364166
  •   

答案 2 :(得分:0)

在我的情况下,很类似的问题,可以通过避免以下行来解决:

 table.numberOfRows(inSection: cells.count)

这种尝试要求表视图在更新其单元格的过程中返回单元格数据的操作会导致崩溃。删除该行后,该表可以正常工作。