我对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并不能完成此工作。
让我们往后退一会儿。首先,你确定你想让你的模态展示在第一步吗?大多数时候情况并非如此,所以让我们暂时将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() }
}
}
}
编辑:增加了一种便捷的方式来解除