我是SwiftUI的新手(像大多数人一样),试图弄清楚如何删除我嵌入在NavigationView中的List上面的一些空白。

在此图像中,您可以看到列表上方有一些空白。

我想要完成的是:

我试过用:

.navigationBarHidden(true)

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

我现在像这样设置我的navigationview:

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

其中FileBrowserView是一个带有List和FileCells的视图,定义如下:

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

我想指出的是,这里的最终目标是,您将能够单击这些单元格来更深入地导航到文件树中,因此在更深入的导航中应该在栏上显示一个后退按钮,但在我的初始视图中,我不希望顶部出现这样的任何东西。


当前回答

我有一个类似的问题,当工作在一个应用程序,TabView应该显示一旦用户登录。

正如@graycampbell在他的评论中建议的那样,TabView不应该嵌入到NavigationView中,否则“空白”将会出现,即使使用.navigationBarHidden(true)

我使用ZStack来隐藏NavigationView。注意,对于这个简单的示例,我使用@State和@Binding来管理UI可见性,但是您可能希望使用更复杂的东西,例如环境对象。

struct ContentView: View {

    @State var isHidden = false

    var body: some View {
        
        ZStack {
            if isHidden {
                DetailView(isHidden: self.$isHidden)
            } else {
                NavigationView {
                    Button("Log in"){
                        self.isHidden.toggle()
                    }
                    .navigationBarTitle("Login Page")
                }
            }
        }
    }
}

当我们按下Log In按钮时,初始页面消失,DetailView被加载。当我们切换注销按钮时,登录页面重新出现

struct DetailView: View {
    
    @Binding var isHidden: Bool
    
    var body: some View {
        TabView{
            NavigationView {
                Button("Log out"){
                    self.isHidden.toggle()
                }
                .navigationBarTitle("Home")
            }
            .tabItem {
                Image(systemName: "star")
                Text("One")
            }
        }
    }
}

其他回答

我试着设置 .navigationBarTitle("", displayMode: .inline) .navigationBarHidden(true) 但这并不奏效。问题是我把它设置成

NavigationView{...}.navigationBarTitle("", displayMode: .inline)
        .navigationBarHidden(true)

但是为了摆脱NagigationBar,它应该被设置为内部视图

NavigationView{
InnerView{}.navigationBarTitle("", displayMode: .inline)
        .navigationBarHidden(true)
}

希望这能有所帮助 要查看具体操作,您可以查看这个开源应用程序(WIP) https://github.com/deepaksingh4/KidsBookApp

我有同样的问题,并发现下面的代码工作得最好。

   .navigationTitle("")
   .navigationBarBackButtonHidden(true)

这是一个存在于SwiftUI中的错误(在Xcode 11.2.1中仍然存在)。我写了一个ViewModifier来修复这个问题,基于现有答案的代码:

public struct NavigationBarHider: ViewModifier {
    @State var isHidden: Bool = false

    public func body(content: Content) -> some View {
        content
            .navigationBarTitle("")
            .navigationBarHidden(isHidden)
            .onAppear { self.isHidden = true }
    }
}

extension View {
    public func hideNavigationBar() -> some View {
        modifier(NavigationBarHider())
    }
}

我对这个问题的解决方案与@Genki和@Frankenstein的建议相同。

我对内部列表(不是NavigationView)应用了两个修饰符来消除空格:

.navigationBarTitle("", displayMode: .automatic)
.navigationBarHidden(true) 

在外层的NavigationView上,然后应用. navigationbartitle ("TITLE")来设置标题。

同样的问题,我终于解决了。为了让导航完全消失,你需要在NavigationView和它里面的所有NavigationsLinks中添加这些修饰符:

.navigationBarHidden(true)
.navigationBarTitleDisplayMode(.inline)

如果你不这样做,NavigationLinks也不会工作。