我是SwiftUI的新手(就像大多数人一样),正在试图弄清楚如何在我嵌入到NavigationView中的List个基础上go 掉大约whitespace个.

在此图像中,您可以看到List上方有一些空白.

Current Version

我想做到的是:

Ideal Version

我试过使用:

.navigationBarHidden(true)

但这并没有带来任何明显的变化.

我当前正在设置我的NavigiationView,如下所示:

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

其中,FileBrowserView是定义为ListFileCells的视图,如下所示:

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要求您还将.navigationBarHidden设置为.navigationBarTitle才能正常工作.

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

使现代化

正如@Peacemoon在 comments 中指出的那样,当您在导航堆栈中导航得更深时,导航栏将保持隐藏状态,无论您在后续视图中是否将其设置为navigationBarHiddenfalse.正如我在 comments 中所说的,这要么是苹果糟糕的实现造成的,要么就是文档糟糕(谁知道呢,也许有一个"正确"的方法可以做到这一点).

无论如何,我想出了一个变通办法,似乎能产生原始海报想要的效果.我很犹豫是否推荐它,因为它看起来不必要的繁琐,但没有任何直接的隐藏和取消隐藏导航栏的方法,这是我能做的最好的 Select .

本例使用三个视图-View1有一个隐藏的导航栏,View2View3都有带标题的可见导航栏.

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似乎无法正确覆盖最初设置navigationBarHiddentrue的视图的首选项,因此我唯一能想到的解决方法是在将新视图推到导航堆栈上时使用绑定来更改原始视图的首选项.

就像我说的,这是一个老生常谈的解决方案,但没有苹果的官方解决方案,这是我能想到的最好的解决方案.

Ios相关问答推荐

第三方框架的iOS隐私声明

如何通过S定义的对象设置删除基于块的观察者的测试?

将数据传回VC时委托为空

如何使用参与者允许并行读取,但阻止对SWIFT中资源的并发读取和写入?

Swift locationManager.requestWhenInUseAuthorization() 不提示用户

核心媒体基础知识,了解 CMSampleBuffer、CMBlockBuffer 和 CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer

我正在try 制作一种 Select 器样式,例如设置中的外观 Select 器

使用 Foundation 解压缩文件

以正确的方式在 Text() 中使用 colored颜色

.onAppear() 函数不适用于 NavigationLink

在 SwiftUI 中打开 PDF

如何将 ImageView 放置在 UIView 的中心?

将flutter android项目导入iOS

如何在 Swift 3 中根据 UIImage 的大小/比率调整 UIImageView 的大小?

刷新由 Xcode 7 管理的团队配置文件中的设备?

Xcode 10.2 无法在 iOS < 10 的模拟器上运行应用程序

Xcode 4.2 如何将一个项目包含到另一个项目中?

从故事板导航到其他 Swift 1.2 文件时 Xcode 6.3 崩溃

使用 Xcode 的 All Exceptions 断点时忽略某些异常

ARC - __unsafe_unretained 的含义?