Swift按引用传递实现及MVVM数字递增应用视图不更新问题求助
SwiftUI MVVM 视图不更新问题修复
问题出在CounterViewModel中对model的修饰符使用错误。@ObservedObject是SwiftUI视图用来监听ObservableObject变化的修饰符,在ViewModel内部应该用@Published来包装Model实例,这样当Model的@Published属性更新时,ViewModel才能把变化通知给视图。
修复方案一:给ViewModel的model添加@Published
修改CounterViewModel代码:
import SwiftUI class CounterViewModel: ObservableObject { @Published var model = Model() // 将@ObservedObject替换为@Published func increment() { self.model.count += 1 } }
修复方案二:ViewModel转发Model的count属性(更符合MVVM封装)
如果想隐藏Model内部细节,可在ViewModel中定义自己的@Published属性,转发Model的变化:
import SwiftUI class CounterViewModel: ObservableObject { private let model = Model() @Published var count: Int { get { model.count } set { model.count = newValue } } func increment() { count += 1 } }
对应的视图部分也要调整为访问ViewModel的count属性:
Text("\(viewModel.count)")
原因说明
- 在ViewModel内部使用
@ObservedObject修饰model时,ViewModel不会自动将Model的变化传递给外部视图。只有用@Published包装Model,Model的@Published属性更新时,ViewModel的objectWillChange发布者才会触发,通知视图刷新。 - 方案二更贴合MVVM设计原则:视图仅与ViewModel交互,无需感知Model的存在,ViewModel负责处理业务逻辑并向视图提供数据。
内容的提问来源于stack exchange,提问作者level5
相关产品推荐
相关产品推荐

