提问者:小点点

在SwiftUI中更改根视图时如何关闭模态视图?


我对Swiftui中的模态视图有一个问题。

下面是我的代码:

struct RootView: View {
    @State var showViewA: Bool = true

    var body: some View {
        if showViewA {
            ViewA(showViewA: $showViewA)
        } else {
            Text("View B")
        }
    }
}

struct ViewA: View {
    @Binding var showViewA: Bool

    @State var showModal: Bool = false

    var body: some View {
        Button(action: { showModal.toggle() }) {
            Text("Show Modal View")
        }
        .sheet(isPresented: $showModal) {
            ModalView(showViewA: $showViewA)
        }
    }
} 

struct ModalView: View {
    @Binding var showViewA: Bool

    var body: some View {
        Button(action: { showViewA.toggle() }) {
            Text("Change to View B")
        }
    }
}

问题:在模态视图中按下按钮时,视图A会像它应该的那样消失,视图B取而代之。但是,模态视图并不会消失,而是停留在视图B的顶部。

当更改为视图B时,如何强制关闭模式视图?请注意,showviewa状态也可以由模态视图以外的其他视图更改,因此只将showmodal状态传递给模态视图并在单击按钮时将其设置为false并不能完成此工作。


共1个答案

匿名用户

让我们往后退一会儿。首先,你确定你想让你的模态展示在第一步吗?大多数时候情况并非如此,所以让我们暂时将bool设置为false。

此外,当在同一视图上有@state@binding时,要非常谨慎。这是一个明显的迹象,表明我们不确定哪个视图拥有什么。

因此,通过具有一个可重用的视图(在本例中为modalview)可以使这一点更加清晰,当按下按钮调用它时,我们将使它成为我们想要的任何内容。请参阅下面的代码:

    import SwiftUI

struct RootView: View {
    @State var showView: Bool = false
    @State var selectedView = "A"

    var body: some View {
        VStack {
            Button("Show View A") {
                selectedView = "A"
                self.showView = true }
            Button("Show View B") {
                selectedView = "B"
                self.showView = true
            }.sheet(isPresented: $showView) {
                ModalView(view: selectedView)
            }
        }
    }
}


struct ModalView: View {
    @Environment(\.presentationMode) var pMode
    let view: String

    var body: some View {
        VStack {
            Text("View \(view)")
                .padding()
            Button("Dismiss") {self.pMode.wrappedValue.dismiss() }
        }
        
        }
    }

编辑:增加了一种便捷的方式来解除