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的状态。我希望这是有道理的...