在SwiftUI中,我希望将环境对象传递给视图模型,以便可以更改/更新它.EnvironmentObject是一个简单的AppState,由单个属性计数器组成.

class AppState: ObservableObject {
    @Published var counter: Int = 0 
}

视图模型"CounterViewModel"更新环境对象,如下所示:

class CounterViewModel: ObservableObject {
    
    var appState: AppState
    
    init(appState: AppState) {
        self.appState = appState
    }
    
    var counter: Int {
        appState.counter 
    }
    
    func increment() {
        appState.counter += 1
    }
    
}

ContentView显示值:

struct ContentView: View {
    
    @ObservedObject var counterVM: CounterViewModel
    
    init(counterVM: CounterViewModel) {
        self.counterVM = counterVM
    }
    
    var body: some View {
        VStack {
            Text("\(counterVM.counter)")
            Button("Increment") {
                counterVM.increment()
            }
        }
        
    }
}

我也正在注入状态,如下所示:

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        NavigationStack {
            
            let appState = AppState()
            
            ContentView(counterVM: CounterViewModel(appState: appState))
                .environmentObject(appState)
        }
    }
}

问题是,当我单击增量按钮时,计数器VM.计数器从不返回更新后的值.我错过了什么?

推荐答案

您的类CounterViewModel是一个可观察对象,但它没有@Published个属性,因此不会自动将更改发布到视图中.

但您可以使用objectWillChange.send()手动发布更改:

    func increment() {
        objectWillChange.send()
        appState.counter += 1
    }

Ios相关问答推荐

如何在进行滑动删除操作时保持自定义视图背景静态

缺少预期的键:';NSPrival yCollectedDataTypes';

当S没有身体时该如何处理

clang:错误:SDK 路径中不包含libarclite

如何在 Android 上的 Flutter 应用中录制内部音频?

如何在用户点击的位置使用SceneKit渲染球体?

归档时命令 PhaseScriptExecution 失败,退出代码非零

实现 ListView Builder Widget Flutter 后退按钮不起作用

为什么 Swift 不在启动的同一线程上恢复异步函数?

滚动 swiftUI 列表时,未调用单元格的任务修饰符.怎么修?

无法为 Flutter 项目构建 ipa [CocoaPods 找不到 pod "GoogleAppMeasurement" 的兼容版本:]

.overlay 和 body 是什么 swift 概念

从远程通知启动时,iOS 应用程序加载错误

UIImageView 使用 CGAffineTransform 错误旋转

如何从一个特定的视图控制器中隐藏导航栏

Swift枚举继承

Xcode 8:函数类型不能有参数标签 destruct 我的构建

aps-environment 始终在发展

UITextView 内容插图

UIView - 加载视图时如何获得通知?