我正试图使用一个弹出菜单(当用户触发它时会出现(,让我的应用程序的用户能够在Subview1
和Subview2
之间更改主视图中显示的子视图。
我试图使用全局Bool
变量来实现这一点,当按下工作表内视图中的按钮时,这些变量会发生变化。基于这些值,主视图应该返回不同的子视图
问题是,当我试图从显示在图纸内的视图中选择一个选项时,Button
的操作被执行,图纸被忽略,但主视图显示的子视图保持不变
有没有办法更改子视图或重新加载主视图?
我在主视图中使用的代码是:
struct ContentView: View {
@State var showMenu = false
var body: some View {
if(subview1Selected){
return AnyView(SubView1())
} else if (subview2Selected){
return AnyView(SubView2())
}
else {
return AnyView(
Button(action: {
showMenu = true
})
{
Text("Button")
}
.sheet(isPresented: $showMenu, content: {
MenuView()
})
)
}
}
我为弹出式工作表使用的代码就像菜单一样是:
struct MenuView: View {
@Environment(.presentationMode) var presentationMode
var body: some View {
List{
Button(action: {
subview1Selected = true
subview2Selected = false
self.presentationMode.wrappedValue.dismiss()
})
{
Text("Subview1")
}
Button(action: {
subview2Selected = true
subview1Selected = false
self.presentationMode.wrappedValue.dismiss()
})
{
Text("Subview2")
}
}
}
}
子视图为:
struct SubView1: View {
@State var showMenu = false
var body: some View {
Button(action: {
showMenu = true
})
{
Text("SubView1")
}
.sheet(isPresented: $showMenu, content: {
MenuView()
})
}
}
和:
struct SubView2: View {
@State var showMenu = false
var body: some View {
Button(action: {
showMenu = true
})
{
Text("SubView2")
}
.sheet(isPresented: $showMenu, content: {
MenuView()
})
}
}
我想这就是您想要做的。您可以将@State-showMenu变量作为@Binding变量传递到菜单中。如果你只有两个视图,你可以使用Bool,但使用我为你添加的自定义枚举更实用。此外,菜单按钮可能应该与子视图分开。
struct ContentView: View {
enum SubViewOption {
case subview1
case subview2
}
@State var showMenu = false
@State var subviewSelected: SubViewOption?
var body: some View {
ZStack() {
switch subviewSelected {
case .subview1:
SubView1()
case .subview2:
SubView2()
default:
Text("Select a view to begin.")
}
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.overlay(
Button(action: {
showMenu.toggle()
}, label: {
Text("Menu")
.padding()
.frame(maxWidth: .infinity)
.foregroundColor(.white)
.background(Color.gray.cornerRadius(30))
.padding()
})
, alignment: .bottom
)
.sheet(isPresented: $showMenu, content: {
MenuView(subviewSelected: $subviewSelected)
})
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
struct MenuView: View {
@Environment(.presentationMode) var presentationMode
@Binding var subviewSelected: ContentView.SubViewOption?
var body: some View {
List {
Button(action: {
subviewSelected = .subview1
presentationMode.wrappedValue.dismiss()
}, label: {
Text("Subview1")
})
Button(action: {
subviewSelected = .subview2
presentationMode.wrappedValue.dismiss()
}, label: {
Text("Subview2")
})
}
}
}
struct SubView1: View {
var body: some View {
ZStack {
Color.red
.edgesIgnoringSafeArea(.all)
Text("THIS IS SUBVIEW 1")
.foregroundColor(.white)
}
}
}
struct SubView2: View {
var body: some View {
ZStack {
Color.blue
.edgesIgnoringSafeArea(.all)
Text("THIS IS SUBVIEW 2")
.foregroundColor(.white)
}
}
}