iOS SwiftUI:ObservableObject从父级到子级

时间:2019-11-26 11:30:07

标签: ios swift swiftui combine

问题:

传递视图模型并从子视图中进行修改,不会刷新父视图。

我想要什么:

每当我从子视图修改视图模型时,父视图也会刷新。

问题描述:

我正在寻找一种将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

1 个答案:

答案 0 :(得分:2)

您可以使用专门设计的@EnvironmentObject代替向每个子视图传递相同的模型。

基本上,您必须在父视图中注入ObservableObject这样的内容(通常在呈现父视图之前在您的appdelegate中,或在用于实时预览的预览设置中):

Parent().environmentObject(ViewModel())

然后您可以在每个视图中自动获得如下引用:

struct AnyChild: View {
    @EnvironmentObject var model: ViewModel
    //...
}

并与您的绑定一起使用

这里是article的简短介绍,有关环境的使用

最后,关于您的解决方案为何不起作用的原因,您必须考虑单个事实来源(父级中可观察的对象),并为每个最终会更改该对象状态的子视图使用@Binding。我希望这是有道理的...