Xcode 12 beta 4
我有带有两个不同模式视图的ContentView。我想使用sheet(isPresented: onDismiss: content:)
显示第一个视图,当它关闭时,会自动显示第二个视图。
struct ContentView: View {
@State var showFirst = false
@State var showSecond = false
var body: some View {
VStack(spacing: 20) {
Text("showFirst: \(showFirst.description)")
Text("showSecond: \(showSecond.description)")
Button("show") {
showFirst.toggle()
}
.sheet(isPresented: $showFirst) {
showSecond.toggle()
} content: {
FirstView(isPresented: $showFirst)
}
Text("")
.sheet(isPresented: $showSecond) {
SecondView(isPresented: $showSecond)
}
}
}
}
struct FirstView: View {
@Binding var isPresented: Bool
var body: some View {
VStack {
Button("close") {
isPresented = false
}
Text("First View")
}
}
}
struct SecondView: View {
@Binding var isPresented: Bool
var body: some View {
VStack {
Button("close") {
isPresented = false
}
Text("Second View")
}
}
}
然后运行代码。 如果我通过向下拖动手势来关闭模型视图,那么它将起作用。 如果我通过点击关闭按钮来关闭第一个视图,则在关闭第二个视图时会崩溃,并引发致命错误:
致命错误:SheetBridge:检测到放弃的演示文稿:文件SwiftUI,第0行
无论如何,只要点击第一个视图的关闭按钮并关闭第二个视图,$showSecond
都不会变为false。
向下拖动和手动切换$ isPresented之间有什么区别吗?
如果我使用presentationMode.wrappedValue.dismiss()
而不是绑定isPredented
,它也会崩溃。
答案 0 :(得分:3)
解决方法是延迟显示第二张纸,以使第一张纸完全完成。
通过Xcode 12 / iOS 14测试
Button("show") {
showFirst.toggle()
}
.sheet(isPresented: $showFirst) {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { // << here !!
showSecond.toggle()
}
} content: {
FirstView(isPresented: $showFirst)
}
答案 1 :(得分:0)
这是Xcode 12 beta中的错误。
该版本已经在Xcode 12.2中进行了测试。