Swiftui 更新EnvironmentObject将我推回

Swiftui 更新EnvironmentObject将我推回,swiftui,Swiftui,我有两个视图ListView和DetailView 列表视图: @EnvironmentObject var userData: UserData var body: some View { VStack { ForEach(userData.packs) { pack in if pack.added { NavigationLink(destination: DetailView

我有两个视图ListView和DetailView

列表视图:

@EnvironmentObject var userData: UserData

var body: some View {
        VStack {
            ForEach(userData.packs) { pack in
                if pack.added {
                    NavigationLink(destination: DetailView(packIndex: self.userData.packs.firstIndex(where: { $0.id == pack.id })!)) {
                        MyRowViewDoesntMatter(pack: pack)
                    }
                }
            }
        }
        .padding(.horizontal)
    }
详细视图:

@EnvironmentObject var userData: UserData
var packIndex: Int

VStack {
       List {
           VStack {
               .... some Vies ... doesn't matter
       .navigationBarItems(trailing:



      THE PROBLEM IS HERE (BELOW)

      Button(action: {
               self.userData.packs[self.packIndex].added.toggle()
      }) {
        Image(systemName: self.userData.packs[self.packIndex].added ? "plus.circle.fill" : "plus.circle")
      }
      ...
问题是当我在DetailView中单击navigationBarItems中的按钮时。“@EnvironmentObject var userData:userData”的“added”属性将被更新,用户的屏幕将返回(到行视图)。我喜欢EnvironmentObject的问题,因为数据被更新了,视图试图重新渲染(?),这就是为什么它会把我推回去

如何修复它?单击按钮后,我想停留在DetailView屏幕

另外,我需要使用EnvironmentObject类型,因为当我返回时,我需要查看结果

多谢各位

这里是可能的方法(通过引入某种选择)。由于
NavigationView
不允许从堆栈中删除链接(作为堆栈导航的标识符),可能还值得考虑在完成编辑时将
DetailView
应用到公共容器中的单独视图模型

使用Xcode 11.4/iOS 13.4进行测试

代码的某些复制,用于测试:

struct ListView: View {
    @EnvironmentObject var userData: PushBackUserData

    @State private var selectedPack: Pack? = nil
    var body: some View {
        NavigationView {
            VStack {
                ForEach(Array(userData.packs.enumerated()), id: \.element.id) { i, pack in
                    NavigationLink("Pack \(pack.id)", destination:
                        DetailView(pack: self.$selectedPack)
                            .onAppear {
                                self.selectedPack = pack
                            }
                            .onDisappear {
                                self.userData.packs[i].added = self.selectedPack?.added ?? false
                            }
                    ).isHidden(!pack.added)
                }
            }
            .padding(.horizontal)
        }
    }
}

struct DetailView: View {
    @Binding var pack: Pack?
    var body: some View {
        VStack {
               List {
                   VStack {
                    Text("Pack \(pack?.id ?? "<none>")")
                   }
                }
               .navigationBarItems(trailing:
                  Button(action: {
                       self.pack?.added.toggle()
                  }) {
                    Image(systemName: pack?.added ?? false ? "plus.circle.fill" : "plus.circle")
                  }
                )
            }
    }
}

你能展示一下
pack
类型吗?
struct-pack:identification{var-id:String-added:Bool}
我已经试过了。不幸的是,这没有帮助。因为我需要更新
DetailView
中的
@EnvironmentObject var userData:userData
,这将导致在这里更改
self.userData.packs.firstIndex(其中:{$0.id==pack.id})
ListView
中,因此它将我从
DetailView
推回到
ListView
并显示新的/更新的
列表。
extension View {
    func isHidden(_ hidden: Bool) -> some View {
        Group {
            if hidden { self.hidden() }
            else { self }
        }
    }
}