SwiftUI 上的 NavigationLink 两次推送视图 [英] NavigationLink on SwiftUI pushes view twice

查看:38
本文介绍了SwiftUI 上的 NavigationLink 两次推送视图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

When adding a NavigationLink in SwiftUI the destination is presented twice, ex: I tap on the NavigationLink and it pushes my destination but when I dismiss the destination, via the back button or the swipe gesture it pushes the destination again without taping on the link. Here is the part of my code that handles the link:

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:按照建议,我删除了代码中的一些噪音:

EDIT 01: As suggested I removed a bit of the noise in the code:

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 数组上的 itens 数量,推送次数是相同的.

EDIT 02: I think I narrowed down, basically if I remove the ForEach the NavigationLink pushes correctly to the next View. Also depending on the number of itens I have on my array for the ForEach the number of pushes is the same.

推荐答案

我通过将 NavigationLink 的标签设置为模型项的唯一 ID 解决了这个问题.

I solved this by setting the NavigationLink's tag to the unique id of the model item.

假设您的 imageRef、ReferenceImage 类有一个 id.

Assuming you have an id for your imageRef, ReferenceImage class.

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()), tag: imageRef.id) {
                    EmptyView()
                    .frame(width: 90, height: 90)
                }

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

NavigationLink(destination: ReferenceARSwiftUIView(currentImage: imageRef.getUIImage()), tag: imageRef.id)

这篇关于SwiftUI 上的 NavigationLink 两次推送视图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆