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

时间:2021-03-29 13:12:44

标签: swiftui combine

如何更新视图,当视图模型发布 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?

3 个答案:

答案 0 :(得分:1)

让你的班级符合ObservableObject

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

但他发现你必须直接观察它,你不能将它链接在 ViewModel

@ObservedObject var user: User 中使用 View

答案 1 :(得分:0)

使用 struct 而不是 class

struct User {
    var id  = "123"
    var name = "jhon"
}

答案 2 :(得分:0)

你应该使用结构:


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)
            }
    }
}
相关问题