SwiftUI NavigationLink操作侦听器不起作用

问题描述 投票:0回答:1

这是我目前在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 navigationlink
1个回答
0
投票

经过长期的奋斗,我找到了解决方案。实际上,我对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,那么该应用程序的导航流程将开始出现异常行为。

© www.soinside.com 2019 - 2024. All rights reserved.