SwiftUI如何在保持后退按钮的同时隐藏导航栏

时间:2020-07-14 15:28:21

标签: swiftui navigationbar init

因此,我试图在SwiftUI的“详细信息”视图中隐藏navigationBar。从技术上讲,我已经通过在另一个视图中使用init()使其工作了,但是问题是它使整个应用程序的navigationBar透明,我只希望在一个视图中使用它。我没有在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()相似:

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

// DetailsView //

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。我不确定我是不是做错了什么,也不知道这是否是正确的方法,但是任何帮助都将不胜感激!

此外,还有一个注释,是否有人知道如何使用NavigationView在iOS 14中隐藏statusBar?

1 个答案:

答案 0 :(得分:3)

我认为您尝试使用UIKit逻辑而不是SwiftUI逻辑。这就是我要隐藏导航栏的方法,该导航栏在视图的顶部顶部带有一个后退按钮。 至于隐藏状态栏,我将使用.statusBar(hidden:true)。 但这似乎不适用于iOS14。可能是一个错误...您可以参考本主题的Apple documentation

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