更新视图模型,发布对象,属性更新时
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 是一个领域对象。以上是关于更新视图模型,发布对象,属性更新时的主要内容,如果未能解决你的问题,请参考以下文章