据我所知,我应该能够使用EnvironmentObject从层次结构中的任何视图观察和访问模型数据。我有这样一个视图,其中显示了一个来自LinkListStore中的数组的列表。当我打开AddListView并添加一个项时,它将正确地用添加的项刷新ListsView。但是,如果我使用PresentationButton来表示,则必须执行AddListView().environmentObject(listStore)操作,否则在显示AddListView时会出现崩溃。我的基本假设是正确的(这是行为很可能是一个错误),还是我误解了EnvironmentObject的使用?
基本上:@State将变量绑定到同一视图中的视图(例如,$text到TextField),@ObjectBinding/BindableObject将变量绑定到其他视图,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发布于 2019-06-08 19:19:49
来自苹果文档EnvironmentObject
EnvironmentObject一种动态视图属性,它使用祖先视图提供的可绑定对象来在绑定对象发生更改时使当前视图失效。
当绑定影响到当前视图层次结构时,就会进行转换。我的猜测是,当您通过PresentationButton呈现一个新视图时,您正在创建一个新的层次结构,这个层次结构并不植根于您的视图--您提供了对象的视图。我想这里的解决方法是通过实现一个确认EnvironmentKey协议的结构,将对象添加到“全局”环境中。
https://stackoverflow.com/questions/56508673
复制相似问题