SwiftUI - 两个导航栏

Posted

技术标签:

【中文标题】SwiftUI - 两个导航栏【英文标题】:SwiftUI - Two navigation bars 【发布时间】:2021-03-01 15:06:57 【问题描述】:

我有一个问题,在我注册一个新用户后,应用程序返回到主菜单(使用 NavigationLink),然后如果我选择菜单中的一个选项,在下一个视图中我有 2 个导航栏.

我正在 MainView 中使用 NavigationView。

struct ContentView: View 
var body: some View 
    NavigationView 
        MainView()
    

struct MainView: View 
var body: some View 
        VStack 
            NavigationLink(
                destination: AuthView(),
                label: 
                    Text("Sesion")
                )
            
        
        

struct AuthView: View 

@State private var email: String = ""
@State private var password: String = ""

let lightGreyColor = Color(red: 239.0/255.0, green: 243.0/255.0, blue: 244.0/255.0, opacity: 1.0)

var body: some View 
        VStack() 
          
                NavigationLink(
                    destination: RegisterView(),
                    label: 
                        Text("Registrarse")
                            .font(.headline)
                            .foregroundColor(.white)
                            .padding()
                            .frame(width: 200, height: 60)
                            .background(Color.green)
                            .cornerRadius(15.0)
                    )
            
        
        .padding()
        .navigationBarTitle("Autenticacion")
        .navigationBarTitleDisplayMode(.inline)
    

struct RegisterView: View 
@ObservedObject var registerController = RegisterController()

@State private var showingRegistrationAlert = false

@State var navigateNext = false

let lightGreyColor = Color(red: 239.0/255.0, green: 243.0/255.0, blue: 244.0/255.0, opacity: 1.0)

var body: some View 
        VStack 
            VStack(alignment: .leading) 
                
            Spacer()
            
            NavigationLink(destination:  ContentView(), isActive:$navigateNext) 
                                Text("")
            
                Button(action:  if registerController.validateRegistration() 
                    showingRegistrationAlert.toggle()
                ) 
                    Text("Enviar registro")
                
                .alert(isPresented: $showingRegistrationAlert) 
                    Alert(title: Text("Se registro correctamente"), dismissButton: .default(Text("Ok"), action: 
                        navigateNext.toggle()
                    ))
                
            
        .padding()
        .navigationBarTitle(Text("Registracion"), displayMode: .inline)
    

我尽量减少代码,如果太多了,抱歉。

【问题讨论】:

这是很常见的问题,1000 次回答!你搜索过旧问题吗? 是的,但是我解决不了,你。 【参考方案1】:

您正在 RegisterView 中添加第二个 NavigationView。这就是问题所在!因为使用了ContentView,为了解决使用MainView()。

 struct RegisterView: View 
@ObservedObject var registerController = RegisterController()

@State private var showingRegistrationAlert = false

@State var navigateNext = false

let lightGreyColor = Color(red: 239.0/255.0, green: 243.0/255.0, blue: 244.0/255.0, opacity: 1.0)

var body: some View 
        VStack 
            VStack(alignment: .leading) 
                
            Spacer()
            
            NavigationLink(destination: MainView(), isActive:$navigateNext)              // <<: here
                                Text("")
            
                Button(action:  if registerController.validateRegistration() 
                    showingRegistrationAlert.toggle()
                ) 
                    Text("Enviar registro")
                
                .alert(isPresented: $showingRegistrationAlert) 
                    Alert(title: Text("Se registro correctamente"), dismissButton: .default(Text("Ok"), action: 
                        navigateNext.toggle()
                    ))
                
            
        .padding()
        .navigationBarTitle(Text("Registracion"), displayMode: .inline)
    


【讨论】:

【参考方案2】:

您只想让 NavigationView 位于层次结构中的 TOP 视图上 - 不要在任何子视图上使用它,即使由 NavigationLink 呈现。

编辑:如果您已经这样做了,请发布代码示例,我可以查看更多详细信息。

我喜欢的另一个选择是将 SwiftUI 视图包装在 UIHostingController 中并使用 UIKit 进行导航 - 因为 NavigationLinks 自发布以来一直存在错误。

【讨论】:

是的,我已经这样做了,现在我要发布示例,你。

以上是关于SwiftUI - 两个导航栏的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI一起学之十 -- 导航栏

带有 SwiftUI 的标签栏上方的额外导航视图

更新 SwiftUI 导航栏标题

SwiftUI 搜索栏与导航栏一致

SwiftUI 中的 QLPreviewController 缺少导航栏

Objective C 到 SwiftUI 隐藏导航栏