问题:
传递 View 模型并从子级修改它,不会刷新父级。
我想要的是:
每当我从 subview 修改 View 模型时,父 View 也会刷新。
问题描述:
我正在寻找一种方法来传递 ViewModel ObservedObject
对一些 child 的看法。
这是我的结构:
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
}
}
这样,每当我从 subview 修改 View 模型时, subview 都会正确重建,但父 View 不会,并且 ScrollView 不会正确调整大小。我想像 Binding 对象一样将 viewModel 传递给 child ,所以 parent 也会刷新。
但我不知道该怎么做。有什么帮助吗?
解决方案:
我遇到了
Form
的具体问题当我删除一切工作正常。但仍然是 的正确解决方案@Alladinian 写的是使用
@EnvironmentObject
最佳答案
您可以使用 @EnvironmentObject
而不是将相同的模型传递给每个 subview 而是专门为此设计的。
你基本上必须注入(inject)你的 ObservableObject
在您的父 View 中使用类似这样的内容(通常在呈现父 View 之前在您的 appdelegate 中,或在您的预览设置中进行实时预览):
Parent().environmentObject(ViewModel())
然后您可以使用以下内容自动在每个 View 中获取引用:
struct AnyChild: View {
@EnvironmentObject var model: ViewModel
//...
}
并将其与您的绑定(bind)一起使用
这是一个简短的article关于使用环境
最后,关于为什么您的解决方案不起作用,您必须考虑单一的事实来源(Parent 中的可观察对象)和
@Binding
对于最终将更改此对象状态的每个子 View 。我希望这是有道理的......
关于iOS SwiftUI : ObservableObject from parent to child,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59049974/