繁体   English   中英

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

[英]Can I use a button inside a SwiftUI sheet view that appears on top of my main SwiftUI view to change a subview inside the main view?

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

我正在尝试使用全局Bool变量来做到这一点,当按下工作表内视图中的按钮时,这些变量会发生变化。 基于这些值,主视图应返回不同的子视图

问题是,当我尝试 select 从工作表内显示的视图中选择一个选项时,执行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 变量传递到菜单中。 如果您只有 2 个视图,则可以使用 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)
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM