SwiftUI如何隐藏导航栏但保留返回按钮?

7

我想在 SwiftUI 的详细视图中隐藏导航栏。我已经在另一个视图中使用了 init() 来实现,但问题是这样会使整个应用程序的导航栏透明,而我只想在一个视图中这样做。我没有在 DetailsView 中使用 init() 是因为我有一个需要输入的变量,所以我不确定如何做!以下是初始化器的代码:

init() {
    let navBarAppearance = UINavigationBar.appearance()
    navBarAppearance.backgroundColor = .clear
    navBarAppearance.barTintColor = .clear
    navBarAppearance.tintColor = .black
    navBarAppearance.setBackgroundImage(UIImage(), for: .default)
    navBarAppearance.shadowImage = UIImage()
}

以下是在detailsView内部添加init()后的Content View和Details View代码:

// ContentView //

struct ContentView: View {
    var body: some View {
        NavigationView {
            List {
                ForEach(0..<5) { i in
                    NavigationLink(destination: DetailsView(test: 1)) {
                        Text("DetailsView \(i)")
                    }
                }
                
            }
            .listStyle(InsetGroupedListStyle())
            .navigationBarTitle("Test App")
        }
    }
}

// 详细视图 //

struct DetailsView: View {
    
    var test: Int
    
    var body: some View {
        ScrollView {
            Text("More Cool \(test)")
            Text("Cool \(test)")
            Text("Less Cool \(test)")
        }
    }
    
    init(test: Int) {
        self.test = 8
        let navBarAppearance = UINavigationBar.appearance()
        navBarAppearance.backgroundColor = .clear
        navBarAppearance.barTintColor = .clear
        navBarAppearance.tintColor = .black
        navBarAppearance.setBackgroundImage(UIImage(), for: .default)
        navBarAppearance.shadowImage = UIImage()
    }
}

struct DetailsView_Previews: PreviewProvider {
    static var previews: some View {
        DetailsView(test: 8)
    }
}

这是我代码的大大简化版,但它展示了我的问题。在没有需要传递变量的情况下,init() 可以成功去掉该视图中的导航栏。然而,当有变量输入时,它不仅会将所有视图更改为数字 "8",而且甚至无法隐藏navigationBar。我不确定是否做错了什么,也不确定这是否是正确的方法,但任何帮助都将不胜感激!
此外,顺便问一句,有人知道如何在 iOS 14 中使用 NavigationView 隐藏 statusBar 吗?
1个回答

9

我认为你试图使用UIKit的逻辑而不是SwiftUI的逻辑。这是我会做的事情,来隐藏带有返回按钮的导航栏并排在视图顶部前面。

至于隐藏状态栏,我会使用.statusBar(hidden: true)。

但似乎在iOS14上无法正常工作,可能是一个bug... 你可以参考苹果文档关于此主题的说明。

struct DetailsView: View {
  
  @Environment(\.presentationMode) var presentation
  
  var test: Int
  
  var body: some View {
    ZStack(alignment: .topLeading) {
      
      ScrollView {
        Text("More Cool \(test)")
        Text("Cool \(test)")
        Text("Less Cool \(test)")
      }
      
      Button(action: { presentation.wrappedValue.dismiss() }) {
        HStack {
          Image(systemName: "chevron.left")
            .foregroundColor(.blue)
            .imageScale(.large)
          Text("Back")
            .font(.title3)
            .foregroundColor(.blue)
        }
      }
      .padding(.leading)
      .padding(.top)
    }
    .navigationTitle(Text(""))
    .navigationBarHidden(true)
    .statusBar(hidden: true)
  }
}

明白了,我不确定最好的方法,但这样做很好,谢谢! - Jabinator1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接