SwiftUI показать / скрыть проблемы заголовка с NavigationBar - PullRequest
1 голос
/ 02 апреля 2020

У меня есть следующая конструкция кода, которая доставляет мне много хлопот:

//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 в главном представлении в NavigationView, которое мне нужно для того, чтобы NavigationLinks на работу. Я также должен сделать это на этом «верхнем» уровне, так как мне нужен новый вид, который будет вызываться ссылками в выдвижном меню, чтобы охватить весь экран, а не только ширину, на которую выводится выдвигающийся вид.

Моя проблема в том, что я, конечно, не хочу, чтобы панель навигации занимала место на главном экране. Для этого я установил для скрытого атрибута значение true. Это позволяет выполнять все приложение, а также отключает навигационное представление в подпредставлениях, связанных с помощью кнопок в меню. Что не дает мне возможности вернуться назад.

Мой вопрос будет: 1) Есть ли более элегантный способ сделать все это? 2) Как я могу повторно вызвать панель навигации в вложенных представлениях? (Установка скрытого атрибута панели навигации обратно на false не работала.

1 Ответ

1 голос
/ 02 апреля 2020

Ниже представлен возможный способ скрытия панели навигации в представлении root и отображения в дочерних подпредставлениях. Только необходимые модификации находятся в представлении root.

Протестировано с Xcode 11.4 / iOS 13.4

demo

Вот * root, дочерние дочерние представления являются обычными и не требуют специального кода для этого случая. Смотрите важные примечания в строке.

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
            }
        }
    }
}
...