【问题标题】:Binding @Published property of parent view's viewModel to @Published property of child view's viewModel: SwiftUI将父视图的 viewModel 的 @Published 属性绑定到子视图的 viewModel 的 @Published 属性:SwiftUI
【发布时间】:2021-02-08 10:17:30
【问题描述】:

我有这个设置: 父视图:PostsListView 子视图:PostEditView

  • PostsListView 显示帖子的列表简短描述
  • 点击任何帖子时,我会显示子视图:PostEditView
  • 目标是在此处调用 API,当用户返回 PostsListView 时,它应该显示更新的描述

我正在使用 MVVM,所以在 PostsListView 中

@ObservedObject var viewModel : PostsListViewModel    
LazyVGrid(columns: columns) {
                    ForEach(viewModel.posts, id: \.self) { post in
                        NavigationLink(
                            destination: PostEditView(viewModel: PostEditViewModel(post: post))){
                                Text(post: post)
                                    .lineLimit(3)
                        }
                    }
                }

我将视图模型(PostEditViewModel(post:)) 从父视图传递给 childView。

我不确定如何在两个视图的 viewModel 之间绑定这个“post”对象。

仅供参考的视图模型:

PostsListViewModel:

class PostsListViewModel: ObservableObject{
    @Published var posts: [Post]
    //api operations....
}

PostEditViewModel:

class PostEditViewModel: ObservableObject{
    @Published var post: Post
    //custom Post mutation and api operations....
}

【问题讨论】:

    标签: swift mvvm swiftui


    【解决方案1】:

    您不需要执行任何特殊的合并操作。只要确保Post 是一个引用类型(class) 并将Post 实例从PostListViewModel.posts 传递给PostEditViewModel.post,这样每当你在子VM 中改变Post 对象的任何属性时,同样的变化也会反映在父虚拟机上,因为Post 对象是一个引用类型,并且两个虚拟机都引用了同一个对象。

    【讨论】:

    • TL;DR:这引入了另一个问题,真正的深拷贝。 (在某些极端情况下)问题是,如果我从当前基于 Struct 的模型切换到 Class,我必须进行大量重构。另外,如果没记错的话,使用引用类型模型意味着如果我想要执行临时更改或不应该传播到所有引用者的更改,我必须确保创建新的(副本)模型对象。即深拷贝。这就是我使用 Structs 值类型的原因。
    猜你喜欢
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    相关资源
    最近更新 更多