Панель навигации SwiftUI не исчезает - PullRequest
0 голосов
/ 04 марта 2020

У меня есть NavigationView, где я установил .navigationBarHidden(true) в моем SplashScreen. Здесь он корректно не отображается, однако, когда я go перехожу на следующий экран, появляется полоса NavigationView. Как правильно скрыть панель навигации? Фон также не отображается должным образом.

Вид

struct EventsScreen: View {

    var eventsRepository: EventsRepository

    @State
    var currentPage: Int = 0
    @State
    private var searchTerm : String = ""


    func getEventSections() -> [EventSection] {
        eventsRepository.fetchEventSections()
    }

    func getViewControllers() -> [UIHostingController<EventFeatureView>] {
        return eventsRepository.fetchFeaturedEvents().map({ event in
            UIHostingController(rootView: EventFeatureView(event: event))
        })
    }
    var body: some View {
        NavigationView {
            List {
                ZStack(alignment: .top) {

                    EventViewController(controllers: self.getViewControllers(), currentPage: self.$currentPage)
                    VStack {
                        SearchBar(text: $searchTerm)
                            .padding(EdgeInsets.init(top: 16, leading: 16, bottom: 0, trailing: 16))
                        HStack {
                            Spacer()
                            Chip(text: "Dates", action:  {
                                //TODO filter on dates
                            })
                            Chip(text:"Type", action: {
                                //TODO filter event type
                            })
                            Chip(text: "Points", action: {
                                //TODO filter points
                            })
                            Spacer()
                        }
                    }
                }.listRowInsets(EdgeInsets())
                    .frame(height: 600)
                ForEach(self.getEventSections()) { section in
                    EventSectionView(eventSection: section)
                }
            }
        }
        .background(LinearGradient(gradient: Gradient(colors: [.black, ColorTheme.brandPurple.color]), startPoint: .top, endPoint: .bottom))
        .navigationBarTitle(Text("Events"), displayMode: .inline)
    .navigationBarHidden(true)
    }
}

Ответы [ 2 ]

1 голос
/ 05 марта 2020

Вы можете установить .navigationBarHidden(true) для ребенка View, представляемого в NavigationView. Я не уверен, как выглядит следующий экран View, но я бы попробовал вот что:

struct NextScreen: View {
    var body: some View {
        Group {
            // existing body content
        }
        .background(LinearGradient(gradient: Gradient(colors: [.black, ColorTheme.brandPurple.color]), startPoint: .top, endPoint: .bottom))
        .navigationBarTitle(Text("Next Screen"), displayMode: .inline)
        .navigationBarHidden(true)
    }
}

Group на всякий случай, если содержимое вашего тела не полностью заключено в View (например, VStack, List, et c.) Какого-то рода.

Может быть полезно думать об этом так:

NavigationView обычно наследуется .navigationBarHidden() от его дочерних взглядов. Тем не менее, поскольку .navigationBarHidden() и .background() явно определены вне NavigationView в EventsScreen, они, как представляется, работают в обратном направлении и применяются также к дочерним представлениям в EventsScreen (если только эти представления не имеют своих собственных явно определенные свойства).

Хотя представление NextScreen по-прежнему представлено в NavigationView, NextScreen инициализируется с собственными свойствами по умолчанию, такими как цвет фона. Как только приложение перейдет / обновится до NextScreen, свойства NextScreen будут иметь прецедент, включая значение по умолчанию .navigationBarHidden(false) и, вероятно, системный цвет фона. Это вопрос о том, какой View (и его свойства) будет иметь прецедент, и SwiftUI имеет тенденцию давать первые метки дочерним элементам и расширяться оттуда (при условии, что область действия данного свойства применяется к его родительским представлениям).

Таким образом, в итоге, эти значения по умолчанию должны быть явно переопределены в каждом представлении, которое появляется в NavigationView, если вы хотите, чтобы они оставались измененными.

0 голосов
/ 04 марта 2020

Вот что говорит SDK:

/// Hides the navigation bar for this view.
///
/// This modifier only takes effect when this view is inside of and visible
/// within a `NavigationView`.
///
/// - Parameters:
///     - hidden: A Boolean value that indicates whether to hide the
///       navigation bar.
@available(OSX, unavailable)
public func navigationBarHidden(_ hidden: Bool) -> some View

, поэтому вам нужно установить значение false для каждого вида сверху, отображаемого в NavigationView во время навигации, в противном случае оно будет отображаться при наблюдении.

...