当前位置: 首页 > 知识库问答 >
问题:

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

范高刚
2023-03-14

我对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个答案

广晔
2023-03-14

让我们往后退一会儿。首先,你确定你想让你的模态展示在第一步吗?大多数时候情况并非如此,所以让我们暂时将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() }
        }
        
        }
    }

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

 类似资料:
  • 问题内容: 最后,现在有了Beta 5,我们可以以编程方式弹出到父视图。但是,在我的应用程序中,有几个地方视图都有一个“保存”按钮,该按钮可以结束几个步骤并返回到开始。在UIKit中,我使用popToRootViewController(),但是我一直无法找到在SwiftUI中执行相同操作的方法。 以下是我尝试实现的模式的简单示例。有任何想法吗? 问题答案: 设置视图调节到一个关键是让弹出到根的工

  • 问题内容: 我目前正在构建一个带有弹出模式视图的应用程序,其中包含WkWebView。当我想在此模式视图中上传图像并且出现“照片选择”时,模式视图只是退回到触发它的视图控制器。 我该如何预防? } 谢谢! 问题答案: 我遇到了同样的问题。我发现文件上载操作表在选择一个选项时尝试自行关闭两次,这也导致模式被关闭。 一种解决方案是将包含webview的子类化,并重写以忽略它,除非它实际上有一个。 像这

  • 我开始尝试,我感到惊讶的是,更改

  • 最后,使用Beta 5,我们可以通过编程方式弹出到父视图。然而,在我的应用程序中有几个地方,视图有一个“保存”按钮,它结束了一个多步骤的过程并返回到开始。在UIKit中,我使用popToRootViewController(),但我无法在SwiftUI中找到同样的方法。 下面是我试图实现的模式的一个简单例子。 我该怎么做?

  • 问题内容: 我试图弄清楚Angular的工作原理,并在模型更改时无法更新视图。 的HTML JS http://jsfiddle.net/N2G7z/ 有任何想法吗? 问题答案: 正如上面提到的Ajay beniwal一样,您需要使用Apply来开始消化。

  • 问题内容: 我已按照此处的说明进行操作,但仍不确定这部分内容: 我曾尝试以编程方式实例化视图控制器,但仍然无济于事。 这是我退出模态视图控制器时的代码: 我正在使用情节提要通过模式视图进行筛选。 这是我希望传输回父视图控制器的数据: 这是两个字符串值。 编辑: 我试图从模态视图控制器传递数据,如下所示: 而在父视图控制器上,我这样做的是: 当我按下打印按钮时,我仍然无法获得任何价值。 模态视图控制