传递视图模型并从子视图中进行修改,不会刷新父视图。
每当我从子视图修改视图模型时,父视图也会刷新。
我正在寻找一种将ViewModel ObservedObject
传递到某些子视图的方法。
这是我的结构:
struct Parent: View {
@ObservedObject viewModel: ViewModel
var body: some View {
NavigationView {
Form {
ScrollView(showsIndicators: false) {
Section {
ChildViewOne(model: viewModel)
}
Section {
ChildViewTwo(model: viewModel)
}
Section {
ChildViewThree(model: viewModel)
}
}
}
}
}
}
struct AnyChild: View {
@ObservedObject viewModel: ViewModel
var body: some View {
// some stuff
}
}
通过这种方式,每当我从子视图修改视图模型时,子视图都可以正确重建,而父视图则不能重建,scrollview不能正确调整大小。
我想像绑定对象一样将viewModel传递给孩子,所以父对象也会刷新。
但是我不知道该怎么办。有帮助吗?
删除所有内容后,我对Form
有一个特定的问题。
但 @Alladinian 所写的正确解决方案仍然是使用@EnvironmentObject
答案 0 :(得分:2)
您可以使用专门设计的@EnvironmentObject
代替向每个子视图传递相同的模型。
基本上,您必须在父视图中注入ObservableObject
这样的内容(通常在呈现父视图之前在您的appdelegate中,或在用于实时预览的预览设置中):
Parent().environmentObject(ViewModel())
然后您可以在每个视图中自动获得如下引用:
struct AnyChild: View {
@EnvironmentObject var model: ViewModel
//...
}
并与您的绑定一起使用
这里是article的简短介绍,有关环境的使用
最后,关于您的解决方案为何不起作用的原因,您必须考虑单个事实来源(父级中可观察的对象),并为每个最终会更改该对象状态的子视图使用@Binding
。我希望这是有道理的...