7

我开发了一个UITableViewController屏幕。它在Xcode 10.2上运行良好,但是。当我在Xcode 11 beta 1上运行时,它会像下面那样崩溃。

我没有发现发生了什么。

在 ViewDidLoad

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.tableFooterView = UIView()
    plateNoPrefix.becomeFirstResponder() // static cell textfield in tableViewcell
}

异常... 在更新过程中尝试访问 table view 的 visibleCells,这是不允许的

4

2 回答 2

8

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

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

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

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

选项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
 }

有关详细信息,您可以参考Apple Developer Forum

于 2019-06-19T07:35:58.760 回答
3

这是 iOS 13 中的一个新异常,UITableView 将引发该异常,以防止并主动提醒您以前会导致未定义行为和各种奇怪、看似无关且难以调试的问题的情况

请查看Apple 开发者论坛

于 2019-07-18T07:27:09.620 回答