首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EnvironmentObject in SwiftUI

EnvironmentObject in SwiftUI
EN

Stack Overflow用户
提问于 2019-06-08 17:30:48
回答 1查看 2.9K关注 0票数 2

据我所知,我应该能够使用EnvironmentObject从层次结构中的任何视图观察和访问模型数据。我有这样一个视图,其中显示了一个来自LinkListStore中的数组的列表。当我打开AddListView并添加一个项时,它将正确地用添加的项刷新ListsView。但是,如果我使用PresentationButton来表示,则必须执行AddListView().environmentObject(listStore)操作,否则在显示AddListView时会出现崩溃。我的基本假设是正确的(这是行为很可能是一个错误),还是我误解了EnvironmentObject的使用?

基本上:@State将变量绑定到同一视图中的视图(例如,$text到TextField),@ObjectBinding/BindableObject将变量绑定到其他视图,EnvironmentObject则将变量绑定到@ObjectBinding,但不每次传递存储对象。这样,我应该能够从多个视图向数组中添加新项,并仍然正确地刷新列表视图?否则,我就不明白ObjectBinding和EnvironmentObject之间的区别。

代码语言:javascript
复制
struct ListsView : View {

@EnvironmentObject var listStore: LinkListStore

var body: some View {
    NavigationView {
        List {

            NavigationButton(destination: AddListView()) {
                HStack {
                    Image(systemName: "plus.circle.fill")
                        .imageScale(.large)
                    Text("New list")
                }
            }

            ForEach(listStore.lists) { list in
                HStack {
                    Image(systemName: "heart.circle.fill")
                        .imageScale(.large)
                        .foregroundColor(.yellow)
                    Text(list.title)
                    Spacer()
                    Text("\(list.linkCount)")
                }
            }
            }.listStyle(.grouped)
        }

    }
}

#if DEBUG
struct ListsView_Previews : PreviewProvider {
    static var previews: some View {
        ListsView()
            .environmentObject(LinkListStore())
    }
}
#endif
EN

回答 1

Stack Overflow用户

发布于 2019-06-08 19:19:49

来自苹果文档EnvironmentObject

EnvironmentObject一种动态视图属性,它使用祖先视图提供的可绑定对象来在绑定对象发生更改时使当前视图失效。

当绑定影响到当前视图层次结构时,就会进行转换。我的猜测是,当您通过PresentationButton呈现一个新视图时,您正在创建一个新的层次结构,这个层次结构并不植根于您的视图--您提供了对象的视图。我想这里的解决方法是通过实现一个确认EnvironmentKey协议的结构,将对象添加到“全局”环境中。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56508673

复制
相关文章

相似问题

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