【发布时间】: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 的好决定。
重现错误的步骤。
- 我使用带有 List、ForEach 和动态部分的 SwiftUI 视图 (
TestCrashIPAD)(源代码如下)。 - 一些静态部分是预定义的,一些动态部分在从服务器获取后出现。
- 重要该错误仅在首次出现时可重现!不要转到其他屏幕或最小化应用!
- 只需打开此视图 (
TestCrashIPAD)。 - 等待动态部分出现。
- 一旦部分出现,请尝试长按on the cell with text "r1" or "r2" or ... (screenshot)
- 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