我现有的TableViewController在Xcode 11 beta1上崩溃

Kat*_*gan 5 xcode uitableview ios ios13 xcode11

我已经开发了一个UITableViewController屏幕。但是在Xcode 10.2上工作正常。当我在Xcode 11 beta 1上运行时,它崩溃如下。

我没有发现发生了什么事。

在ViewDidLoad中

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.tableFooterView = UIView()
    plateNoPrefix.becomeFirstResponder() // static cell textfield in tableViewcell
}
Run Code Online (Sandbox Code Playgroud)

异常…试图访问表视图的visibleCells时正在更新它们,这是不允许的

Hit*_*esh 8

在为 iOS 13 提供支持时,我遇到了同样的问题。

这是 iOS 13 中的一个新异常,它UITableView会引发并主动提醒您之前会导致未定义行为和各种奇怪、看似无关且难以调试的问题(包括崩溃)的情况。

这里发生的事情UITableView是在要求其 dataSource 为每个单元格返回一个单元格的过程中,visible row并且正在配置返回的单元格的属性以便它们可以显示。在此更新过程中——很可能是在表视图本身关于特定行(例如tableView(_:cellForRowAt:) tableView(_:canEditRowAt:)等)的回调中 ——您的代码要求表视图返回可见单元格。这显然是有问题的,因为UITableView正处于准备这些单元格的过程中,所以它不可能返回有意义的答案。

解决此问题的方法是查看在引发visibleCellsexception问题时在回溯中调用的位置,然后执行以下两项操作之一:

选项1:

将 的使用visibleCells移到更好的地方,这样您就不会要求visibleCells在创建/配置/更新这些相同单元格的过程中调用的某个地方。请求可见单元格的好地方是在表格视图布局之后,例如,如果表格视图是视图控制器的视图,您可以使用viewDidLayoutSubviews(),或者在UITableView调用super.layoutSubviews().

选项 2:

根据您实际尝试执行的操作,您可能可以完全跳过使用可见单元格。例如,您可能能够利用回调tableView(_:willDisplay:forRowAt:)tableView(_:didEndDisplaying:forRowAt:)跟踪单元格何时可见。

如果您遇到此异常并且您认为您正在从一个应该有效/允许的位置请求可见单元格,请分享您遇到此异常时的回溯以及有关您尝试执行的操作的详细信息。

更新:

我敢肯定,但plateNoPrefix.becomeFirstResponder()导致崩溃。截至目前,您可以通过在viewDidAppear方法中粘贴此代码来检查

或者

延迟后执行此代码(为我工作)

 DispatchQueue.main.asyncAfter(deadline: .now()+0.1) {
      // Your code
 }
Run Code Online (Sandbox Code Playgroud)

有关详细说明,您可以参考Apple Developer Forum