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