添加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
相关产品推荐
相关产品推荐

