使用SwiftUI。单击后,“我的滑块/侧面菜单”会启动新视图,但单击按钮,现在所有选项均为'dead'

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用SwiftUI。单击后,“我的滑块/侧面菜单”会启动新视图,但单击按钮,现在所有选项均为'dead'相关的知识,希望对你有一定的参考价值。

使用SwiftUI和我增加的滑块/侧边菜单教程,以便对每个侧边菜单选择进行操作。

显示侧边菜单并点击菜单选项时,它的效果很好,可将我带到带有菜单项的新视图。但是,当我点击并看到侧面菜单仍然存在时,所有菜单项都没有消失。菜单项仍然可以使点击动起来(闪烁),但是什么也没有发生。我必须关闭侧面菜单,然后重新打开,然后菜单项再次起作用-一次。

谁能告诉我为什么会这样吗?

这里是漂亮的contentview,mainview和sidemenu视图。

//ContentView.swift

import SwiftUI

struct ContentView: View {

    @State var showMenu = false

var body: some View {

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

    return NavigationView {
        GeometryReader { geometry in
            ZStack(alignment: .leading) {
                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))
                }
            }
                .gesture(drag)
        }
            .navigationBarTitle("Side Menu", displayMode: .inline)
            .navigationBarItems(leading: (


                   Button(action: {
                        withAnimation {
                            self.showMenu.toggle()
                        }
                    }) {
                        Image(systemName: "line.horizontal.3")
                            .imageScale(.large)
                    }
                ))
        }
    }
}

struct MainView: View {

    @Binding var showMenu: Bool

    var body: some View {
        Button(action: {
            withAnimation {
               self.showMenu = true
            }
        }) {
            Text("Show Menu")
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

这是侧面菜​​单视图。

//MenuView.swift

import SwiftUI


struct PlayerView: View {
    @State var showMenu = true
    //@EnvironmentObject var session: SessionStore

    var body: some View {
        VStack{
            //self.showMenu = true
            Text("Manage Players Here").foregroundColor(.red)

         }
    }
}


struct MenuView: View {
    @State var showMenu = true


    var body: some View {

        VStack(alignment: .leading) {

            HStack() {

                NavigationLink(destination: PlayerView()) {
                    HStack(){
                        Image(systemName: "person")
                           .foregroundColor(.gray)
                           .imageScale(.large)
                        Text("Players")
                        .foregroundColor(.gray)
                        .font(.headline)
                    }
                }
            }
            .padding(.top, 100)

            }
            .padding()
            .frame(maxWidth: .infinity, alignment: .leading)
            .background(Color(red: 32/255, green: 32/255, blue: 32/255))
            .edgesIgnoringSafeArea(.all)
    }
}


struct MenuView_Previews: PreviewProvider {
    static var previews: some View {
        MenuView()
    }
}

    enter code here
答案

1)在MenuView中绑定var

2)使用Zstack的OnAppear {}关闭showMenu

      struct ContentView: View {
                                                  @State var showMenu = false

                                                var body: some View {

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

                                                    return NavigationView {
                                                        GeometryReader { geometry in
                                                            ZStack(alignment: .leading) {
                                                                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(showMenu: self.$showMenu)
                                                                        .frame(width: geometry.size.width/2)
                                                                        .transition(.move(edge: .leading))
                                                                }
                                                            }
                                                                .gesture(drag).onAppear {
                                                                    self.showMenu = false
                                                                }
                                                        }
                                                            .navigationBarTitle("Side Menu", displayMode: .inline)
                                                            .navigationBarItems(leading: (


                                                                   Button(action: {
                                                                        withAnimation {
                                                                            self.showMenu.toggle()
                                                                        }
                                                                    }) {
                                                                        Image(systemName: "line.horizontal.3")
                                                                            .imageScale(.large)
                                                                    }
                                                                ))
                                                        }
                                                    }
                                                }

                                                struct MainView: View {

                                                    @Binding var showMenu: Bool

                                                    var body: some View {
                                                        Button(action: {
                                                            withAnimation {
                                                               self.showMenu = true
                                                            }
                                                        }) {
                                                            Text("Show Menu")
                                                        }
                                                    }
                                                }




                                struct PlayerView: View {
                                    @State var showMenu = true
                                    //@EnvironmentObject var session: SessionStore

                                    var body: some View {
                                        VStack{
                                            //self.showMenu = true
                                            Text("Manage Players Here").foregroundColor(.red)

                                         }
                                    }
                                }


                                struct MenuView: View {
                                    @Binding var showMenu: Bool // = true


                                    var body: some View {

                                        VStack(alignment: .leading) {

                                            HStack() {

                                                NavigationLink(destination: PlayerView()) {
                                                    HStack(){
                                                        Image(systemName: "person")
                                                           .foregroundColor(.gray)
                                                           .imageScale(.large)
                                                        Text("Players")
                                                        .foregroundColor(.gray)
                                                        .font(.headline)
                                                    }
                                                }
                                            }
                                            .padding(.top, 100)

                                            }
                                            .padding()
                                            .frame(maxWidth: .infinity, alignment: .leading)
                                            .background(Color(red: 32/255, green: 32/255, blue: 32/255))
                                            .edgesIgnoringSafeArea(.all)

                                    }
                                }

以上是关于使用SwiftUI。单击后,“我的滑块/侧面菜单”会启动新视图,但单击按钮,现在所有选项均为'dead'的主要内容,如果未能解决你的问题,请参考以下文章

swiftUI:登录完成后导航到主屏幕。通过按钮单击导航视图

如何在 SwiftUI 中再次初始化 View?

无法单击列表中的 NavigationLink (SwiftUI)

如何在 swift UI 中单击按钮时从 swift UI 导航到情节提要?

SwiftUI:具有计时器样式的文本在提供的日期更改后不会更新

SwiftUI - 为啥 contentShape 会阻止单击叠加层?