SwiftUI使用NavigationBar显示/隐藏标题问题

时间:2020-04-02 16:20:04

标签: ios swift navigation swiftui

我有以下代码构造,这给我带来了很多麻烦:

//Main View
struct ContentView: View {

    var body: some View {
        NavigationView{
            ZStack(alignment: .center){
                CarouselBuilder()
                ProfileInvoke().navigationBarTitle("").navigationBarHidden(true)
            }
        }
    }
}

//Carousel filled with Cards from a DB 
...code irrelevant for my problem

//Profile Invoke -> Invokes a slide out menu called Menu that has NavigationLinks in it
struct Menu: View {
    var body: some View {
        ZStack{
            VStack(alignment: .center){
                    MenuButton(buttonText: "Settings", buttonCallView: AnyView(SettingsView() ))
                    MenuButton(buttonText: "My Favourites", buttonCallView: AnyView(MyFavouritesView()))
                    MenuButton(buttonText: "Sign Out", buttonCallView: AnyView(SignOutView()))
            }.frame(width: UIScreen.main.bounds.width/1.2,alignment: .top)
        }
    }
}

//MenuButtons are basic NavigationLinks linking to certain Views given as argument when calling them

我现在确实将ZStack包装在导航视图的主视图中,为了使NavigationLinks工作,我需要这样做。我还必须在“最高”级别上执行此操作,因为我需要将由滑出菜单中的链接调用的新视图来显示整个屏幕,而不仅仅是显示滑出视图的宽度。

我的问题是,现在我当然不希望导航栏占用主视图中的空间。为此,我将其hidden属性设置为true。此操作将贯穿整个应用程序,并且还会禁用由菜单中的按钮链接到的子视图中的导航视图。这让我无路可退。

我的问题是: 1)是否有更优雅的方式来完成所有这些工作? 2)如何在子视图中重新调用导航栏? (将它们的隐藏导航栏属性设置为false无效。

1 个答案:

答案 0 :(得分:2)

以下是在根视图中隐藏导航栏并在子子视图中显示的一种可行方法。唯一需要的修改是在根视图中。

通过Xcode 11.4 / iOS 13.4测试

demo

这里仅是一个根,子视图是常规的,在这种情况下不需要特殊的代码。内联查看重要说明。

struct RootNavigationView: View {
    @State private var hideBar = true // << track hide state, and default
    var body: some View {
        NavigationView {
            VStack {
                Text("I'm ROOT")
                Divider()
                NavigationLink("Goto Child", destination: NextChildView(index: 1))
                 .simultaneousGesture(TapGesture().onEnded {
                    self.hideBar = false     // << show, here to be smooth !!
                 })
            }
            .navigationBarHidden(hideBar)
        //    .navigationBarTitle("Back to Root") // << optional 
            .onAppear {
                self.hideBar = true  // << hide on back
            }
        }
    }
}
相关问题