【发布时间】:2020-05-04 18:36:39
【问题描述】:
当我在工作表中已经存在的视图上显示工作表时,意外发生了崩溃。我已经能够慢慢剥离部分视图和自定义类型,直到我得到下面仍然显示崩溃的非常简单和通用的视图结构。
当我与 TextField 交互然后与显示子表的按钮之一交互时发生崩溃。有时需要在按钮和文本字段之间点击很多才能触发崩溃,有时它会立即发生(如下面的 GIF 所示)。有时我根本无法让崩溃发生,但我的用户不断报告它。
在下面的 gif 中,崩溃发生在按下底部按钮的那一刻。您可以看到按钮永远不会退出其“按下”状态,并且工作表永远不会出现。
Xcode 没有提供任何有关崩溃的有用信息(截图如下)。
我只在运行 13.4.1 和 Xcode 11.4.1 的 iPhone XR 上实现了它。我在 iPhone 6s 和几个模拟器上尝试过,都无法触发崩溃,但用户已经在多个设备上报告了它。
struct ContentView: View {
@State var showingSheetOne: Bool = false
var body: some View {
Button(action: { self.showingSheetOne = true }) {
Text("Show")
}
.sheet(isPresented: $showingSheetOne) {
SheetOne(showingSheetOne: self.$showingSheetOne)
}
}
}
struct SheetOne: View {
@Binding var showingSheetOne: Bool
@State var text = ""
var body: some View {
VStack {
SheetTwoButton()
SheetTwoButton()
SheetTwoButton()
TextField("Text", text: self.$text)
}
}
}
struct SheetTwo: View {
@Binding var showing: Bool
var body: some View {
Button(action: {
self.showing = false
}) {
Text("Hide")
.frame(width: 300, height: 100)
.foregroundColor(.white)
.background(Color.blue)
}
}
}
struct SheetTwoButton: View {
@State private var showSheetTwo: Bool = false
var body: some View {
Button(action: { self.showSheetTwo = true } ) {
Image(systemName: "plus.circle.fill")
.font(.headline)
}.sheet(isPresented: self.$showSheetTwo) {
SheetTwo(showing: self.$showSheetTwo)
}
}
}
【问题讨论】:
-
有趣。你试过清理你的项目吗? CMD+SHIFT+K 和 CMD+ALT+SHIFT+K?
-
是的,只是再次清洁它以确保它发生两次。一次就像 GIF 一样,第二次是在按了几次按钮并关闭出现的第二张纸之后。
-
我实际上是从我的原始项目中获取了这些视图,并且现在正在一个全新的项目中对其进行测试,以便我可以隔离问题。
-
好吧,我想这就是适合你的 SwiftUI。我试过你的代码,模拟器上什么也没发生。奇怪的一个。尝试放置异常断点。
-
我能够得到异常的描述,但当然 SwiftUI 的实际实现是如此模糊,我不知道这意味着什么:“错误:无法实现:无法读取寄存器 x0 的值错误:在 DoExecute 中出错,无法 PrepareToExecuteJITExpression"