我的主视图位于 ContentView 类中,我在 ContentViewModel 类中进行网络调用,并使用响应更新类调用 User。
我的 ContentView 有几个 subview ,例如 HeaderView。当我从 API 响应更新 User 类属性时,我也想更新 HeaderView 中定义的 UI 元素。如何从 ContentViewModel 类将数据传递到我的 subview (HeaderView)?
我可以通过设置 ContentViewModel 类 ObservableObject 来更新 ContentView 元素,这非常简单
class ContentViewModel: ObservableObject {
并发布了 User 对象
@Published var user = User()
并在同一 ContentViewModel 中收到 API 响应后更新用户的属性
self.user.name = name
我的 ContentView 与其模型类的关系如下所示
@StateObject private var contentViewModel = ContentViewModel()
UI 更新如下
Text("My name \(contentViewModel.user.name)")
这就是ContentView的工作场景。但我需要将值传递给 HeaderView()。 我的用户类别如下
import Foundation
class User {
var name = ""
// more attributes
}
最佳答案
这是我经常使用的模式:(注意没有私有(private)变量)
struct ContentView: View {
@StateObject var contentViewModel = ContentViewModel()
...
var body: some View {
...
HeaderView(contentViewModel: contentViewModel)
}
}
struct HeaderView: View {
@ObservedObject var contentViewModel: ContentViewModel
var body: some View {
...
Text("My name \(contentViewModel.user.name)")
}
}
struct User {
var name = ""
// more attributes
}
您可以使用与“.environment(...)”模式相同的想法将 ContentViewModel 传递给所有 subview 。
编辑:按照@Asperi的建议,用户应该成为一个结构。
关于ios - 如何将数据从父模型类传递到 SwiftUI 中的 subview ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68011805/