我是SwiftUI的新手(就像大多数人一样),试图弄清楚如何删除我在NavigationView中嵌入的List上方的空白。
在此图像中,您可以看到列表上方有一些空白
我要完成的是
我试过使用
.navigationBarHidden(true)
但这并没有进行任何明显的更改。
我目前正在这样设置我的navigationView
NavigationView { FileBrowserView(jsonFromCall: URLRetrieve(URLtoFetch: applicationDelegate.apiURL)) .navigationBarHidden(true) }
其中FileBrowserView是具有列表和像这样定义的单元格的视图
List { Section(header: Text("Root")){ FileCell(name: "Test", fileType: "JPG",fileDesc: "Test number 1") FileCell(name: "Test 2", fileType: "txt",fileDesc: "Test number 2") FileCell(name: "test3", fileType: "fasta", fileDesc: "") } }
我确实要注意,这里的最终目标是您将能够单击这些单元格来更深地浏览到文件树,因此在更深层的导航上应该在栏上显示“后退”按钮,但是我不需要在我的初始视图中排名最高。
由于某些原因,SwiftUI要求您还设置.navigationBarTitle
为.navigationBarHidden
可以正常工作。
NavigationView {
FileBrowserView(jsonFromCall: URLRetrieve(URLtoFetch: applicationDelegate.apiURL))
.navigationBarTitle("")
.navigationBarHidden(true)
}
正如@Peacemoon在注释中指出的那样,无论您是否在后续视图中进行设置navigationBarHidden
,当您在导航堆栈中进行更深入的浏览时,导航栏将保持隐藏false
。就像我在评论中说的那样,这可能是由于Apple实施不佳或仅是糟糕的文档(谁知道,也许有一种“正确”的方式来实现)的结果。
无论如何,我想出了一种解决方法,似乎可以产生原始海报的预期效果。我很犹豫地推荐它,因为它看上去似乎不必要,但如果没有任何隐藏和取消隐藏导航栏的简单方法,这就是我能做的最好的事情。
本示例使用三个视图- View1
具有隐藏的导航栏,View2
并且View3
两个视图均带有可见的带有标题的导航栏。
struct View1: View {
@State var isNavigationBarHidden: Bool = true
var body: some View {
NavigationView {
ZStack {
Color.red
NavigationLink("View 2", destination: View2(isNavigationBarHidden: self.$isNavigationBarHidden))
}
.navigationBarTitle("Hidden Title")
.navigationBarHidden(self.isNavigationBarHidden)
.onAppear {
self.isNavigatiOnBarHidden= true
}
}
}
}
struct View2: View {
@Binding var isNavigationBarHidden: Bool
var body: some View {
ZStack {
Color.green
NavigationLink("View 3", destination: View3())
}
.navigationBarTitle("Visible Title 1")
.onAppear {
self.isNavigatiOnBarHidden= false
}
}
}
struct View3: View {
var body: some View {
Color.blue
.navigationBarTitle("Visible Title 2")
}
}
设置navigationBarHidden
到false
导航堆栈上的更深层次的看法似乎并不恰当覆盖最初设置视图的偏好navigationBarHidden
来true
,所以唯一的解决方法我能想出是使用绑定改变原来的观点的偏好时,一个新的视图被推到导航堆栈上。
就像我说的那样,这是一个棘手的解决方案,但是如果没有Apple的官方解决方案,这就是我能想到的最好的解决方案。