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

update View when view model's, publish object's, property is updated

如何更新视图,当视图模型发布 var(用户)时,名称 属性 会更新。我知道为什么会这样,但在这种情况下更新视图的最佳方式是什么。

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?

让你class符合ObservableObject

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

但他的意思是你必须直接观察它你不能将它链接在 ViewModel

View

中使用@ObservedObject var user: User

你应该使用结构:


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)
            }
    }
}