首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新EnvironmentObject把我推倒了

更新EnvironmentObject把我推倒了
EN

Stack Overflow用户
提问于 2020-04-01 04:02:20
回答 1查看 82关注 0票数 1

我有两个视图ListView和DetailView

ListView:

代码语言:javascript
复制
@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)
    }

DetailView:

代码语言:javascript
复制
@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”属性被更新,用户的屏幕将返回( RowView)。我发现了EnvironmentObject的问题,因为数据被更新了,视图试图重新呈现(?)这就是它把我推回去的原因?

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

附注:我需要使用EnvironmentObject类型,因为当我返回时,我需要查看结果。

非常感谢!

EN

回答 1

Stack Overflow用户

发布于 2020-04-01 15:41:02

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

使用Xcode11.4/ iOS 13.4进行测试。

用于测试的代码的一些复制:

代码语言:javascript
复制
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")
                  }
                )
            }
    }
}

只是方便的助手扩展

代码语言:javascript
复制
extension View {
    func isHidden(_ hidden: Bool) -> some View {
        Group {
            if hidden { self.hidden() }
            else { self }
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60958911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档