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