iOS SwiftUI : ObservableObject from parent to child

标签 ios swift swiftui combine

问题:
传递 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/

相关文章:

ios - 如何简化代码

swift - 如何只取当前时间 (hh :mm:ss format) from Date() in Swift?

macos - 如何在 SwiftUI 中获取默认按钮颜色?

ios - 我怎样才能防止用户点击按钮两次,这样当用户关闭应用程序并打开他仍然无法点击

ios - 点击以在 Swift 中重试连接互联网

swift - 实时绘图哪种方式更好?

swift - 在 PreviewProvider 中模拟 EvironmentObject

ios - XCode 4.5 中 ARC 的 Phantom 内存泄漏,其中肯定调用了 dealloc 或 Instruments 问题?

iphone - 在 iOS 6 中状态栏色调颜色更改为黑色

iphone - 使用MailCore在我自己的应用程序中使用yahoo帐户发送电子邮件