ios - 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 的阵列上的项目数量,推送的数量是相同的。
解决方案
我确信它Part
符合Identifiable
协议并具有id
属性。
的目的地NavigationLink
被多次呈现,因为您在循环中有多个Part
具有完全相同标识的实例。id
forEach
只要确保每个实例都Part
具有唯一性id
,并且一切都会按预期工作。
推荐阅读
- autohotkey - 具有击键组合的 Autohotkey 脚本
- java - 使用原始数组在 Java 中创建排行榜
- gnu-parallel - GNU 并行:从作业日志中删除行会中断并行更新
- vue.js - 点击事件的“toHaveBeenCalled”仅在两次点击后才有效?(测试一个 Vue 应用程序)
- ruby-on-rails - 行更改日志文件中的位置
- javascript - 渲染错误:TypeError:文件未定义
- qt - qt 3d Qml 透明 Scene2D 纹理
- java - Redis 比较并设置原子
- ios - 意外行为文本 textFieldShouldBeginEditing / textFieldDidBeginEditing
- azure-language-understanding - luis 结束 url 是否会识别后跟 & 符号的实体