这是我关于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、Simulator iPad mini 2019 5-gen iOS 13.7、iPad 2018 6-gen iOS 13.7。
2020 年 10 月 26 日更新。此外,我尝试在 MacOS Catalina 10.15.7、iPad 2018 6-gen iOS 13.7 上使用 xCode 12.0.1 。我重新测试,看起来该错误在iOS 13.4-13.7上仍然可用,但在iOS 14上消失了。我没有找到 iOS 13 的好决定。
重现错误的步骤。
- 我将 SwiftUI 视图 (
TestCrashIPAD
) 与 List、ForEach 和动态部分一起使用(源代码如下)。 - 一些静态部分是预定义的,一些动态部分在从服务器获取后出现。
- 重要的错误仅在第一次出现视图时可重现!不要转到另一个屏幕或最小化应用程序!
- 只需打开此视图 (
TestCrashIPAD
)。 - 等到动态部分出现。
- 一旦出现这些部分,请尝试长按带有文本“r1”或“r2”或...的单元格(屏幕截图)
- 崩溃(截图)
碰撞
我在 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
}
}