ios - 如何将数据从父模型类传递到 SwiftUI 中的 subview

标签 ios swift swiftui

我的主视图位于 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/

相关文章:

iphone - MP4 文件不能在 MPMoviePlayerController 中播放?

ios - 如何在 swift 中使用 NSNumber 和 Int 进行 for in 循环

compiler-errors - SwiftUI初始值设定项的圆形度

macos - navigationBarTitle 适用于 iOS 而不是 MacOS 应用程序

ios - 将 CGRect 从 View 转换为 super View 不起作用

ios - Xcode 中的 fatal error - 我知道原因但不知道如何解决

ios - iOS 中应用程序崩溃时如何将应用程序带到应用程序主屏幕

swift - 如何裁剪照片或根据其容器 UIImage View 调整大小?

swift - 在 Swift 中将 ObjectMapper 与 Realm 一起使用时程序崩溃

google-cloud-firestore - 如何在 SwiftUI 中的 firebase 查询期间显示加载动画