我可以在SwiftUI主视图顶部的SwiftUI工作表视图中使用按钮来更改主视图中的子视图吗



我正试图使用一个弹出菜单(当用户触发它时会出现(,让我的应用程序的用户能够在Subview1Subview2之间更改主视图中显示的子视图。

我试图使用全局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)
}
}
}

相关内容

最新更新