首页 > 解决方案 > SwiftUI 上的 NavigationLink 两次推送视图

问题描述

在 SwiftUI 中添加 NavigationLink 时,目的地会出现两次,例如:我点击 NavigationLink,它会推送我的目的地,但是当我通过后退按钮或滑动手势关闭目的地时,它会再次推送目的地而不点击链接。这是我处理链接的代码部分:

var body: some View {
    HStack(spacing: 8.0) {
        ForEach(part.getReference()) { (imageRef: ReferenceImage) in
            ZStack(alignment: .topTrailing) {
                Image(uiImage: imageRef.getUIImage())
                .resizable()
                .frame(width: 90, height: 90)
                .cornerRadius(6)
                .onLongPressGesture {
                    print("looong")
                    self.managedObjectContext.delete(imageRef)
                    do {
                        try self.managedObjectContext.save()
                    } catch {
                        print("error deleting: \(error.localizedDescription)")
                    }
                }
                ZStack(alignment: .center) {
                    Circle()
                        .foregroundColor(Color.appColors.lightRose)
                        .opacity(0.7)
                        .frame(width: 35, height: 35)
                    Image(systemName: "arkit")
                        .imageScale(.large)
                }
                NavigationLink(destination:
                    ZStack {
                        Color.appColors.rose
                            .edgesIgnoringSafeArea(.top)
                        ReferenceARSwiftUIView(currentImage: imageRef.getUIImage())
                            .navigationBarTitle("AR Reference")
                    }

                ) {
                    EmptyView()
                    .frame(width: 90, height: 90)
                }

            }
        }.animation(.interpolatingSpring(stiffness: 0.5, damping: 0.5))

编辑 01: 正如建议的那样,我删除了代码中的一些噪音:

var part: Part
var body: some View {
    HStack(spacing: 8.0) {
        ForEach(part.getReference()) { (imageRef: ReferenceImage) in
            ZStack(alignment: .topTrailing) {
                Image(uiImage: imageRef.getUIImage())
                .resizable()
                .frame(width: 90, height: 90)
                .cornerRadius(6)
                NavigationLink(destination: ReferenceARSwiftUIView(currentImage: imageRef.getUIImage())) {
                    EmptyView()
                    .frame(width: 90, height: 90)
                }

            }
        }.animation(.interpolatingSpring(stiffness: 0.5, damping: 0.5))

编辑 02: 我想我缩小了范围,基本上如果我删除 ForEach,NavigationLink 会正确推送到下一个视图。此外,根据我在 ForEach 的阵列上的项目数量,推送的数量是相同的。

标签: iosswiftui

解决方案


我确信它Part符合Identifiable协议并具有id属性。

的目的地NavigationLink被多次呈现,因为您在循环中有多个Part具有完全相同标识的实例。idforEach

只要确保每个实例都Part具有唯一性id,并且一切都会按预期工作。


推荐阅读