小编典典

如何删除 SwiftUI NavigationView 中的默认导航栏空间

all

我是SwiftUI 的新手(像大多数人一样)并试图弄清楚如何删除List我嵌入在NavigationView.

在此图像中,您可以看到List.

当前版本

我想要完成的是:

理想版

我试过使用:

.navigationBarHidden(true)

但这并没有产生任何明显的变化。

我目前正在像这样设置我的 navigiationView:

NavigationView {
    FileBrowserView(jsonFromCall: URLRetrieve(URLtoFetch: applicationDelegate.apiURL))
        .navigationBarHidden(true)
}

定义如下FileBrowserView的 aList和s 视图在哪里:FileCell

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: "")
    }
}

我确实想指出,这里的最终目标是您将能够单击这些单元格以更深入地导航到文件树中,因此应该在更深入的导航栏上显示一个后退按钮,但我不想要任何东西在我最初的看法中也是如此。


阅读 104

收藏
2022-08-15

共1个答案

小编典典

出于某种原因,SwiftUI 要求您也设置.navigationBarTitlefor.navigationBarHidden才能正常工作。

NavigationView {
    FileBrowserView(jsonFromCall: URLRetrieve(URLtoFetch: applicationDelegate.apiURL))
        .navigationBarTitle("")
        .navigationBarHidden(true)
}

更新

正如@Peacemoon
在评论中指出的那样,当您在导航堆栈中更深入地导航时,导航栏将保持隐藏状态,无论您是否在后续视图中设置navigationBarHidden为。false正如我在评论中所说,这要么是
Apple 执行不力的结果,要么只是可怕的文档(谁知道呢,也许有一种“正确”的方式来实现这一点)。

无论如何,我想出了一个似乎可以产生原始海报所需结果的解决方法。我犹豫是否推荐它,因为它看起来不必要的hacky,但是没有任何直接的隐藏和取消隐藏导航栏的方法,这是我能做的最好的。

此示例使用三个视图 -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")
    }
}

在导航堆栈中设置navigationBarHiddenfalse更深的视图似乎并没有正确覆盖最初设置navigationBarHidden为的视图的首选项true,所以我能想出的唯一解决方法是使用绑定来更改原始视图的首选项。视图被推送到导航堆栈上。

就像我说的,这是一个 hacky 解决方案,但没有 Apple 的官方解决方案,这是我能想到的最好的解决方案。

2022-08-15