据我所知,我应该能够使用EnvironmentObject从层次结构的任何视图中观察和访问模型数据。我有一个类似的视图,在其中显示LinkListStore中的数组列表。当我打开AddListView并添加一个项目时,它会正确刷新带有已添加项目的ListsView。但是,如果使用PresentationButton进行演示,则必须执行AddListView()。environmentObject(listStore),否则在显示AddListView时会崩溃。我的基本假设是正确的(并且这很可能是错误,这是行为)还是我误解了EnvironmentObject的使用?
基本上:@State将变量绑定到同一View中的视图(例如,将$ text绑定到TextField),@ ObjectBinding / BindableObject将变量绑定到其他View,以及EnvironmentObject与@ObjectBinding相同,但不传递每次都存储对象。有了这个,我应该能够从多个视图向数组添加新项目,并且仍然可以正确刷新列表视图?否则,我不会得到ObjectBinding和EnvironmentObject之间的区别。
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
答案 0 :(得分:1)
从Apple文档EnvironmentObject:
EnvironmentObject 一个动态视图属性,它使用祖先视图提供的可绑定对象,只要可绑定对象发生更改,该属性就会使当前视图无效。
由于绑定影响当前视图层次结构而进行翻译。我的猜测是,当您通过PresentationButton呈现新视图时,您正在创建一个新的层次结构,该层次结构不植根于您的视图中-您已将对象提供给该层次结构。我猜这里的解决方法是通过实现确认EnvironmentKey
协议的结构来将对象添加到“全局”环境中。