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?