更新视图模型,发布对象,属性更新时

Posted

技术标签:

【中文标题】更新视图模型,发布对象,属性更新时【英文标题】:update View when view model's, publish object's, property is updated 【发布时间】:2021-03-29 13:12:44 【问题描述】:

如何更新视图,当视图模型发布 var's (user's) 时,name 属性会更新。我确实知道它为什么会发生,但在这种情况下更新视图的最佳方法是什么。

class User 
    var id  = "123"
    @Published  var name = "jhon"


 class ViewModel : ObservableObject 
    @Published var user : User = User()

 

struct ContentView: View 
     @ObservedObject var viewModel = ViewModel() 
    
    var body: some View  
        userNameView 
    

    var userNameView: some View  
        Text(viewModel.user.name)
            .background(Color.red)
            .onTapGesture 
                viewModel.user.name += "update"
                print( viewModel.user.name)
            
    

我这样做的一种方法是像这样使用 onReceive,

var body: some View  

         userNameView
             .onReceive(viewModel.user.$name) output in

                    let tmp = viewModel.user
                           viewModel.user = tmp
                    print("onTapGesture",output)

          

但这不是一个好方法,它会使用用户属性更新所有视图。 我应该为名称创建一个@state var吗? 还是我也应该为用户制作一个 ObservedObject?

【问题讨论】:

这能回答你的问题吗? @Published property not triggering anything 【参考方案1】:

让你的类符合ObservableObject

class User: ObservableObject 
    var id  = "123"
    @Published  var name = "jhon"

但他明白的是,你必须直接观察它,你不能将它链接到 ViewModel

View 中使用@ObservedObject var user: User

【讨论】:

是的,我确实尝试了链接,但它不起作用。所以我应该在视图的初始化或在 didAppear 中设置用户?最好的方法是什么。非常感谢您的回答。 user 应该来自父级View,所以在init 中。不要在init 中找到它,父母必须将其传递给init 看这个question我针对这种情况写了一个相当详细的答案 我知道我们可以使用观察到的对象,但我想有没有其他更简单的方法来解决它。感谢您的帮助。 看看我发布的问题,有一种方法可以按照您的方式进行操作,但您必须使用 onReceive 监听更改并强制更新 ViewModel【参考方案2】:

你应该使用结构:


import SwiftUI

struct User 
    var id: String
    var name: String


class ViewModel : ObservableObject 
    @Published var user : User = User(id: "123", name: "Mike")


struct ContentView: View 
    
    @ObservedObject var viewModel: ViewModel = ViewModel()
    
    var body: some View  
        userNameView
    

    var userNameView: some View  
        
        Text(viewModel.user.name)
            .background(Color.red)
            .onTapGesture 
                viewModel.user.name += " update"
                print( viewModel.user.name)
            
    

【讨论】:

不能使用 struct user 是一个领域对象。

以上是关于更新视图模型,发布对象,属性更新时的主要内容,如果未能解决你的问题,请参考以下文章

可观察对象模型在模型更新时不会更改视图值

如何让我的 WPF 用户控件的依赖属性更新我的视图模型?

如何在视图中设置和调用 rails 方法来更新对象的属性

Django:渲染视图后如何更新模型?

配置文件对象 + 视图模型 + 更新用户配置文件 MVC C#

基于单个数据源更新多个 Qt 模型