这是我目前在SwiftUI NavigationLink中面临的一个尴尬问题。我创建了一个HeaderView(),其中有一个用NavigationLink包装的背面图像。在调用由NavigationView包装的HubRegistrationView()内部的HeaderView()之后。但是,每当我单击后退图标时,都不会发生任何事情。有人可以看看我的代码吗?
这是我的HeaderView()代码:
import SwiftUI
struct HeaderView: View {
var body: some View {
HStack {
NavigationLink(
destination: DashboardView()
.navigationBarHidden(true)
.navigationBarTitle("ABC")
) {
Image("Back Icon")
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 40, height: 40)
}
.buttonStyle(PlainButtonStyle())
Text("HUB REGISTRATION")
.font(.system(size: 25))
.padding()
.foregroundColor(Color("T3"))
}
.padding(.top, 8)
}
}
struct HeaderView_Previews: PreviewProvider {
static var previews: some View {
HeaderView()
}
}
这是我的HubRegistrationView()代码:
import SwiftUI
struct HubRegistrationView: View {
@State var showingImagePicker: Bool = false
@State var imageIdentifier: Int = 0
@State var hubImage: UIImage?
@State var tradeLicenceImage: UIImage?
@State var tinCertificateImage: UIImage?
var body: some View {
GeometryReader { geometry in
NavigationView {
VStack (spacing: 0) {
VStack {
HeaderView()
}
.frame(width: geometry.size.width)
.padding(.top, 14)
.background(Color("B1"))
ZStack {
Image("App Background")
.resizable()
.aspectRatio(contentMode: .fit)
.offset(y: -geometry.size.height/3)
HubFormView(showingImagePicker: self.$showingImagePicker, imageIdentifier: self.$imageIdentifier)
}
.frame(width: geometry.size.width)
}
.edgesIgnoringSafeArea(.all)
.sheet(isPresented: self.$showingImagePicker) {
ImagePicker(image: self.imageIdentifier == 0 ? self.$hubImage : self.imageIdentifier == 1 ? self.$tradeLicenceImage : self.$tinCertificateImage)
}
}
}
}
}
struct HubRegistrationView_Previews: PreviewProvider {
static var previews: some View {
Group {
HubRegistrationView()
HubRegistrationView()
.previewDevice("iPhone 8")
}
}
}
经过长期的奋斗,我找到了解决方案。实际上,我对SwiftUI NavigationView有误解。NavigationView基本上所做的是包含一个视图堆栈,并且每当它(通过NavigationLink)识别到手势时,它都会弹出当前视图堆栈并将其推入其中。例如:
struct ViewA: View {
var body: some View {
NavigationView {
VStack {
Text("A")
Text("B")
...
NavigationLink(destination: ViewB()) {
Text("C")
}
}
}
}
}
struct ViewB: View {
var body: some View {
VStack {
Text("AA")
Text("BB")
...
Text("CC")
}
}
}
在这里,当ViewA中的NavigationView通过在ViewA中按“ C”来识别手势时,它只是将整个VStack弹出NavigationView并将其推入其中。
现在,NavigationView的另一个特征是我误解是当它将ViewB推入其中时,ViewB会自动被NavigationView包裹,因此,如果我们尝试导航到其他视图(例如ViewC),则不需要使用NavigationView将VStack封装在ViewB中。如果这样做,它将与额外的NavigationView重叠,从而导致手势识别出现问题。
总之,如果我们在我们的应用程序中嵌套了NavigationViews,那么该应用程序的导航流程将开始出现异常行为。