【发布时间】:2019-10-23 19:24:00
【问题描述】:
据我所知,我应该能够使用 EnvironmentObject 从层次结构中的任何视图观察和访问模型数据。我有一个像这样的视图,我在其中显示来自 LinkListStore 中的数组的列表。当我打开 AddListView 并添加一个项目时,它会使用添加的项目正确刷新 ListsView。但是,如果我使用PresentationButton来呈现,我必须做AddListView().environmentObject(listStore),否则在显示AddListView的时候会出现crash。我的基本假设是否正确(这种行为很可能是一个错误)还是我误解了 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
【问题讨论】:
-
如果我必须通过 .environmentObject 将后者传递给下一个视图,我似乎在理解 BindableObject 和 EnvironmentObject 之间的区别时遇到了同样的问题。假设我有一个从视图 A 到 B 等到视图 F 的向导,这是否意味着我总是必须传递 environmentObject? @Nico 你有没有发现更多关于这个主题的信息?