在视图模型、发布对象 属性 更新时更新视图
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)
}
}
}
如何更新视图,当视图模型发布 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)
}
}
}