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 - 两个导航栏的主要内容,如果未能解决你的问题,请参考以下文章