SwiftUI 将@Published viewmodel 对象值传递给@Binding

Posted

技术标签:

【中文标题】SwiftUI 将@Published viewmodel 对象值传递给@Binding【英文标题】:SwiftUI passing @Published viewmodel object value to @Binding 【发布时间】:2020-12-06 11:13:51 【问题描述】:

我正在尝试使用 SwiftUI 和绑定更新视图。 我有一个观察 ViewModel 变化的 MainView。 我希望此视图能够响应 viewModel.data.image 中的更改。我不知道如何将值传递给 HeaderView。

目前此代码拒绝编译。我收到一个错误:

Value of type 'ObservedObject <LockedCourseViewModel> .Wrapper' has no dynamic member 'course' using key path from root type

查看:

struct MainView: View 
    @ObservedObject var viewModel = ViewModel()
    
    var body: some View 
        VStack 
            HeaderView(image: $viewModel.data.image)
        
    

视图模型:

class ViewModel: ObservableObject     
    @Published var data: Model?
    
    func fetchData(id: Int) 
        // fetching some data from api
        self.data = Model(data: data)
    

型号:

class Model: ObservableObject 
    @Published var image: URL

页眉视图:

struct HeaderView: View 
    @Binding var image: URL?

感谢您的帮助!

【问题讨论】:

【参考方案1】:

由于您的Model 也是一个类,因此您不需要绑定,而是传递对整个模型的引用并使用其中的图像。

var body: some View 
    VStack 
        // once data is fetched HeaderView will be updated
        HeaderView(model: viewModel.data ?? Model())
    

struct HeaderView: View 
    @ObservedObject var model: Model

    // ... other code

更新:交替绑定到图片

var body: some View 
    let boundImage = Binding(
        get:  viewModel.data?.image ,
        set:  viewModel.data?.image = $0 
    )
    return VStack 
        HeaderView(image: boundImage)
    

【讨论】:

如果在我不使用该模型的其他视图中使用 HeaderView 怎么办? 查看使用代理绑定和原始 HeaderView 的更新。

以上是关于SwiftUI 将@Published viewmodel 对象值传递给@Binding的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 将 @Published var 从一个 ObservableObject 映射到另一个

SwiftUI 将@Published viewmodel 对象值传递给@Binding

如何将我的 SwiftUI 视图的 @State 交换为我的视图模型 @Published 变量?

SwiftUI - 更改 @Published 结构时是不是可以触发 didSet?

SwiftUI:如何使用 UserDefaults 持久化 @Published 变量?

SwiftUI @Published 属性正在 DetailView 中更新