SwiftUI崩溃:关闭工作表视图(由另一个工作表视图触发)时,“ SheetBridge:检测到放弃的演示文稿”

时间:2020-08-07 00:25:38

标签: ios swiftui

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,它也会崩溃。

2 个答案:

答案 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中进行了测试。