You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 21:25:24