【问题标题】:How to launch new View in SwiftUI from a slider menu so that it does not launch within the slider itself如何在 SwiftUI 中从滑块菜单启动新视图,使其不会在滑块本身内启动
【发布时间】:2020-04-20 17:19:55
【问题描述】:

所以我正在使用 SwiftUI 并有一个滑块/侧边菜单窗口。当我启动滑块时,它会出现在屏幕顶部并覆盖大约一半的屏幕宽度。它为用户提供了几个选项。当我单击该菜单上的条目时,新视图将显示在半角滑块菜单窗口中。我希望它关闭滑块,然后改为全屏启动新视图。需要一些帮助。

这是正在运行的滑块...

当我单击其中一个选项时,相应的视图将驻留在滑块窗口中并保持屏幕的一半宽度。我希望滑块缩回,新窗口启动全屏。

这是一些代码。

struct ContentView : View {

@EnvironmentObject var session: SessionStore
    @State var showMenu = false
    @State var isDrawerOpen: Bool = falsevar body: some View {

    let drag = DragGesture()
        .onEnded {
            if $0.translation.width < -100 {
                withAnimation {
                    self.showMenu = false
                }
            }
        }

    return NavigationView {
        Group{
            GeometryReader { geometry in
            ZStack(alignment: .leading) {

            // if the user is logged in, then show the mainview.
            // if the slider is active, then show the slider on top of mainview
            // if the user is not yet logged in then show the login window

                if (self.session.session != nil) {
                    MainView(showMenu: self.$showMenu)
                        .frame(width: geometry.size.width, height: geometry.size.height)
                        .offset(x: self.showMenu ? geometry.size.width/2 : 0)
                        .disabled(self.showMenu ? true : false)
                    if self.showMenu {
                        MenuView()
                            .frame(width: geometry.size.width/2)
                            .transition(.move(edge: .leading))
                    }
                } else {

                    SignInView()

                }
            }//
                .gesture(drag)
        }
            .navigationBarTitle(...

现在,在我的滑块菜单代码中,您将看到当有人单击按钮时我启动视图的位置。我设置了一个带有“DrawerContent”目标视图的 NavigationLink。当我单击下面的“播放器”菜单选项时,它会立即启动 DrawerContent 视图,但它卡在滑块菜单中。请看下面的截图...

struct DrawerContent: View {
    var body: some View {
        //Color.blue
        VStack{
            Text("hello there")
        }
    }
}




struct MenuView: View {

    @State var showMenu = false

var body: some View {

VStack(alignment: .leading) {

    NavigationView{

        List {
            NavigationLink(destination: DrawerContent()
            ) {
                VStack(alignment: .leading){
                    Text("Players")
                        //.font(.system(size: 14))
                }

            }

这是截图...

【问题讨论】:

    标签: swiftui side-menu swiftui-list swiftui-navigationlink


    【解决方案1】:

    我想这是由于在您的MenuView 中使用了另一个NavigationView,如下所示

    struct MenuView: View {
    
       @State var showMenu = false
    
        var body: some View {
           VStack(alignment: .leading) {
               NavigationView{ // <<< this is not needed
    

    只需将其删除,它将使用NavigationView from ContentView

    【讨论】:

    • 太棒了,阿斯佩里。谢谢你。最后一个问题(没有承诺)。现在它很好地启动到一个完整的窗口,它在顶部显示导航返回链接,将用户发送回侧边/滑块菜单。我可以忍受这个,但想知道是否有办法让它返回到 ContentView?我可能可以完全删除返回链接,但这似乎是内存泄漏......
    • 我假设它已经在 ContentView 中,只需要在激活链接时隐藏菜单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    相关资源
    最近更新 更多