如何让 SwiftUI View 知道 ViewModel 的计算属性发生了变化?

问题描述 投票:0回答:1

假设您有 ViewModel,其计算属性可能会不时发生变化:

import Foundation

class ViewModel: ObservableObject {
    private var val = 42;
    
    var compProp: Int {
        return val
    }

    func maybeChange() {
        if (Int.random(in: 0..<2) == 1) {
            val += 1
            ???
            //heyViewThePropertyIsChanged(nameof(compProp))
        }
    }
}

你如何强制视图:

import SwiftUI

struct ContentView: View {
    @StateObject var viewModel: ViewModel
    var body: some View {
        VStack {
            Text("\(viewModel.compProp)").font(.title)
        }
        .frame(minWidth: 320)
        .toolbar {
            Button(action: viewModel.maybeChange) {
                Label("Maybe", systemImage: "gear.badge.questionmark")
            }
        }.padding()
    }
}

反映这样的变化?

swiftui
1个回答
0
投票

每个 ObservableObject 为此目的通过 objectWillChange 提供发布者。

class ViewModel: ObservableObject {
    private var val = 42;
    
    var compProp: Int {
        return val
    }

    func maybeChange() {
        if (Int.random(in: 0..<2) == 1) {
            objectWillChange.send()
            val += 1
        }
    }
}

这会重新创建与使用 Published 属性包装器获得的相同行为。

我会预见到为什么是“willChange”而不是“didChange”的问题: SwiftUI 中的数据要点

© www.soinside.com 2019 - 2024. All rights reserved.