【问题标题】:SwiftUI. App crashes on iPad with iOS 13.4-13.7 when long-pressed斯威夫特用户界面。长按 iOS 13.4-13.7 的 iPad 上的应用程序崩溃
【发布时间】:2021-01-02 03:51:02
【问题描述】:

这是我关于 stackoverflow 的第一个问题。如果我的主题格式有误,请纠正我。

在真正的 iPad 上尝试使用长按(?触觉触摸?)时,我遇到了应用程序崩溃。它还可以在 Simulators iPad 上通过 Force Touch 点击 Magic Trackpad 重现。

哪些设备存在此错误?

iOS 13.4 到最后一个 iOS 13 的所有 iPad。 从 iOS 13.4 到最后一个 iOS 13 的所有 Simulator iPad。

我从未在 iPhone 上看到过这个错误。

我的测试设置:MacOS Catalina 10.15.6、xCode 11.7、 模拟器 iPad mini 2019 5-gen iOS 13.7, iPad 2018 6 代 iOS 13.7。

2020 年 10 月 26 日更新。另外,我尝试在 MacOS Catalina 10.15.7 上使用 xCode 12.0.1, iPad 2018 6 代 iOS 13.7。我重新测试了,看起来该错误在 iOS 13.4-13.7 上仍然存在,但在 iOS 14 上消失了。我没有找到 iOS 13 的好决定。

重现错误的步骤。

  1. 我使用带有 List、ForEach 和动态部分的 SwiftUI 视图 (TestCrashIPAD)(源代码如下)。
  2. 一些静态部分是预定义的,一些动态部分在从服务器获取后出现。
  3. 重要该错误仅在首次出现时可重现!不要转到其他屏幕或最小化应用!
  4. 只需打开此视图 (TestCrashIPAD)。
  5. 等待动态部分出现。
  6. 一旦部分出现,请尝试长按on the cell with text "r1" or "r2" or ... (screenshot)
  7. Get crash (screenshot)

崩溃

我在 AppDelegate 上遇到崩溃: Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)

我调查了一下,发现:这个 bug 从 iOS 13.4 开始就可以重现了。 iOS 13.4 还有一个View Modifier onDrag (link)。可能是它以某种方式连接,因为在调用堆栈中我看到:

UIDragInteractionLongPressDriver
UIGestureRecognizer

动态部分数组可能有问题,因为我看到了:

SwiftUI.Sections.rowIDs(forSectionAt: Swift.Int)
SwiftUI.ListCoreDataSource.rowIndex(at: Foundation.IndexPath)

问题

如何解决这个问题?在这种情况下如何解决而不崩溃?请说出任何想法。

源代码

请看源代码:

import SwiftUI

struct TestCrashIPAD: View {

    @State var sections = [TestSection]()

    var body: some View {
        List {
            // predefined sections
            Section(header: Text("Section predefined")) {
                Text("1")
                Text("2")
            }
            Section(header: Text("Section predefined")) {
                ForEach(1..<7) {
                    Text("\($0)")
                }
            }

            // dynamic content
            ForEach(sections) { section in
                Section(header: Text(section.title)) {
                    ForEach(section.rows) { row in
                        HStack {
                            Text(row.str)
                            Spacer()
                        }
                    }
                }
            }
        }
        .listStyle(GroupedListStyle())
        .navigationBarTitle("iPad crash with long press")
        .onAppear(perform: onAppearAction)
    }

    func onAppearAction() {

        DispatchQueue.global().async {
            // fetch some data from the server
            sleep(3)

            // show data in UI
            DispatchQueue.main.async {
                self.sections = [TestSection](TestSection.array)
            }
        }
    }
}

struct TestSection: Identifiable {
    let id = UUID()
    let title: String
    let rows: [TestRow]

    static var array: [TestSection] {
        var result = [TestSection]()
        for idx in 0..<50 {
            result.append(TestSection(title: "s\(idx)", rows: TestRow.array))
        }
        return result
    }
}

struct TestRow: Identifiable {
    let id = UUID()
    let str: String

    static var array: [TestRow] {
        var result = [TestRow]()
        for idx in 0..<Int.random(in: 3..<7) {
            result.append(TestRow(str: "r\(idx)"))
        }
        return result
    }
}

【问题讨论】:

  • 我们遇到了同样的崩溃。在 foreach 的视图上添加 .onLongPressGesture {} 似乎可以为我们解决这个问题。
  • @mikemike396,它有助于在 iPad 2018(6-Gen)上使用 iOS 13.7 的 xCode 12。您使用哪个版本:xCode 11 还是 12?
  • 我们使用的是 Xcode 12

标签: ios ipad swiftui drag ios13.4


【解决方案1】:

看起来答案是将.onLongPressGesture { } 添加到崩溃的列表中 (我从 cmets 得到了这个,但这解决了我的问题,所以似乎是一个答案。作为答案发布,因为不是每个人都读 cmets

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    • 2019-05-29
    • 2021-05-16
    • 2017-08-30
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多