SwiftUI导航栏不会消失

时间:2020-03-03 22:58:26

标签: ios swift swiftui ios-navigationview

我有一个NavigationView,我在.navigationBarHidden(true)中设置了SplashScreen。在这里它不会正确显示,但是当我进入下一个屏幕时,会出现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)
    }
}

3 个答案:

答案 0 :(得分:1)

您可以为.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(例如VStackList等)中。< / p>

这样思考可能会有所帮助:

NavigationView通常将从其子视图继承.navigationBarHidden()。但是,由于.navigationBarHidden().background()是在NavigationView的{​​{1}}之外明确定义的,因此它们碰巧会沿途工作并应用于{{1}中的子视图}(除非这些视图具有自己明确定义的属性)。

虽然EventsScreen视图仍显示在EventsScreen中,但是NextScreen会使用其自身的默认属性(例如背景色)进行初始化。应用导航/更新到NavigationView后,NextScreen的属性将优先,包括默认的NextScreen以及系统背景色。它是关于哪个View(及其属性)将优先的问题,SwiftUI倾向于首先给孩子们一些麻烦,然后从那里扩大(前提是给定属性的范围适用于其父视图)。

因此,总而言之,如果您希望更改这些默认值,则NextScreen中出现的每个视图都必须明确覆盖这些默认值。

答案 1 :(得分:0)

这是SDK所说的:

keytool

因此,对于导航期间在/// 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,否则将随您观察而显示。

答案 2 :(得分:0)

你需要像这样使用你的代码:

var body: some View {
    NavigationView {
        ...
        .navigationBarTitle(Text("Events"), displayMode: .inline)
        .navigationBarHidden(true)
    }
    // that means only show one view at a time no matter what device I'm working
    .navigationViewStyle(StackNavigationViewStyle())
}

您可以将 navigationBarHidden 绑定到变量,以便您可以在特定条件下更改值。像这样: .navigationBarHidden($onOff)