gpt4 book ai didi

iOS SwiftUI : ObservableObject from parent to child

转载 作者:行者123 更新时间:2023-12-01 16:01:39 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com