我有一个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)
}
}
答案 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
(例如VStack
,List
等)中。< / 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)