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

添加ViewModel导致SwiftUI视图更新失效问题求助

解决SwiftUI MVVM模式下视图不更新的问题

你遇到的问题核心是ViewModel的@Published仅监听Model实例的引用变化:当你修改model.score时,Model对象本身的引用没有改变,所以ObservableObject不会向视图发送更新通知,导致视图无法感知到score的变化。

以下是几种可行的解决方案:

方案一:让Model成为ObservableObject(推荐)

将Model改造为遵循ObservableObject的类,并把score标记为@Published,这样Model内部的属性变化会自动通知ViewModel,进而触发视图更新。

修改后的完整代码:

import SwiftUI

@main
struct MVVM_Test_Watch_AppApp: App {
    @StateObject var viewModel = ViewModel()
    
    var body: some Scene {
        WindowGroup {
            ContentView(viewModel: viewModel)
        }
    }
}

class Model: ObservableObject { // 让Model遵循ObservableObject协议
    @Published var score = 0 // 将score标记为@Published
}

class ViewModel: ObservableObject {
    private var model: Model
    
    init() {
        model = Model()
        // 订阅Model的变化,自动转发给ViewModel的订阅者
        _ = model.objectWillChange.sink { [weak self] _ in
            self?.objectWillChange.send()
        }
    }
    
    var score: Int {
        model.score
    }
    
    func incScore() {
        model.score += 1
    }
}

struct ContentView: View {
    @ObservedObject var viewModel: ViewModel
    
    var body: some View {
        VStack {
            Text("Your score is \(viewModel.score)")
            Button("Increase Score") {
                viewModel.incScore()
            }
        }
    }
}

方案二:手动发送更新通知

如果不想修改Model的结构,可以在ViewModel的incScore方法中,修改完score后手动调用objectWillChange.send(),主动触发视图更新。

修改后的ViewModel代码:

class ViewModel: ObservableObject {
    @Published private var model: Model
    
    init() {
        model = Model()
    }
    
    var score: Int {
        model.score
    }
    
    func incScore() {
        objectWillChange.send() // 手动发送更新通知
        model.score += 1
    }
}

方案三:简化结构,直接在ViewModel中管理score

如果Model的逻辑较为简单,也可以直接将score属性移到ViewModel中,省去Model层的中转:

class ViewModel: ObservableObject {
    @Published var score = 0 // 直接在ViewModel中管理score属性
    
    func incScore() {
        score += 1
    }
}

内容的提问来源于stack exchange,提问作者Ravi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 10:42:39