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

Posted

技术标签:

【中文标题】我现有的 TableViewController 在 Xcode 11 beta1 上崩溃【英文标题】:My Existing TableViewController is crashing on Xcode 11 beta1 【发布时间】:2019-06-19 07:31:21 【问题描述】:

我开发了一个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,这是不允许的

【问题讨论】:

从 xcode 11 beta 4 开始,它会抛出警告而不是崩溃。 对我来说,设置 UITextView.text = "text" 时会发生这种情况,经过几次测试后,它已被修复/停止在该行崩溃。 【参考方案1】:

在为 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

【讨论】:

我得到 Assert's not crash: [Assert] 尝试在表视图上调用 -cellForRowAtIndexPath: 在更新其可见单元格的过程中,这是不允许的。在 UITableViewAlertForCellForRowAtIndexPathAccessDuringUpdate 处创建一个符号断点【参考方案2】:

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

请看Apple Developer Forum

【讨论】:

在 Beta7 上有同样的问题。找到解决方案后会在这里更新

以上是关于我现有的 TableViewController 在 Xcode 11 beta1 上崩溃的主要内容,如果未能解决你的问题,请参考以下文章

如何将窗口过程关联到我现有的对话窗口

为我现有的项目添加一个“教程屏幕”。如何? [关闭]

将现有的 vue js 应用程序添加到我现有的 .net 核心项目中?

如何在 Android Studio 中打开我现有的 Eclipse 项目?

如何在我现有的项目中使用 AgoraLive 完整 SDK

使用保持身份递增的 NHibernate 映射我现有的 ID 列