【问题标题】:iOS SwiftUI: ObservableObject from parent to childiOS SwiftUI:从父级到子级的 ObservableObject
【发布时间】:2019-11-26 11:30:07
【问题描述】:

问题:

传递视图模型并从子级修改它,不会刷新父级。

我想要什么:

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

问题描述:

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

这样,每当我从子视图修改视图模型时,子视图都会正确重建,但父视图不会,并且滚动视图不会正确调整大小。

我想将 viewModel 像 Binding 对象一样传递给子级,因此父级也会刷新。

但我不知道该怎么做。有什么帮助吗?

解决方案:

当我删除一切正常时,Form 出现了一个特定问题。

@Alladinian 所写的正确解决方案仍然是使用@EnvironmentObject

【问题讨论】:

    标签: ios swift swiftui combine


    【解决方案1】:

    您可以使用专门为此设计的@EnvironmentObject,而不是将相同的模型传递给每个子视图。

    你基本上必须在你的父视图中注入你的ObservableObject 类似这样的东西(通常在你的appdelegate中呈现父视图之前,或者在你的预览设置中进行实时预览):

    Parent().environmentObject(ViewModel())
    

    然后你可以在每个视图中自动获取引用,如下所示:

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

    并将它与您的绑定一起使用

    这里简单介绍一下article的使用环境

    最后,关于为什么你的解决方案不起作用,你必须考虑一个单一的事实来源(你的 Parent 中的可观察对象)和一个 @Binding 用于最终会改变这个对象状态的每个子​​视图。我希望这是有道理的......

    【讨论】:

    • 我不太明白您的评论,但如果您的意思是为什么您的解决方案不起作用,因为您应该将绑定传递给它们而不是可观察对象本身...
    • 我已经尝试过您的解决方案,但问题仍然存在。如果我改变孩子的大小,父亲仍然不能正常刷新,内容被剪切
    • 问题出在表格上,我已将其删除,一切正常
    • @EnvironmentObject 似乎是一个美化的全局变量。我很惊讶没有 @State / @Binding 模拟更复杂的对象
    猜你喜欢
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 2017-08-16
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多