代码之家  ›  专栏  ›  技术社区  ›  zumzum

SwiftUI:在SwiftUI视图中对NSManagedObject属性更改做出反应?

  •  0
  • zumzum  · 技术社区  · 2 年前

    我正在试图弄清楚如何让SwiftUI视图对NSManagedObject属性所做的更改做出正确的反应。

    例子:

    class MyViewModel: ObservableObject {
                
        @Published var car:Car // <-- NSManagedObject
        @Published var sold:Bool = false // <-- I don't want to do this, I want to simply observe the sold property on car and not have to implement this sink logic below
        var subs = [AnyCancellable]()
        
        init(car:Car) {
            self.car = car
            self.sold = car.sold
            self.car.publisher(for: \.sold)
                .removeDuplicates()
                .receive(on: RunLoop.main)
                .sink { [weak self] sold in
                    self?.sold = sold
                }
                .store(in: &subs)
        }
        
    }
    

    例如,我有一个开关,可以设置 sold 汽车实体上的属性。

    Toggle(isOn: Binding<Bool>(get: { model.car.sold }, set: { model.car.sold = $0 } )) {
        if model.car.sold {
            Text("ON")
        } else {
            Text("OFF")
        }
    }
    

    切换控件会设置 出售 属性,但切换标签:

        if model.car.sold {
            Text("ON")
        } else {
            Text("OFF")
        }
    

    不会相应更新。

    因此,如果我将汽车实体作为一个整体进行更改,情况会更新,如果我更改实体的属性,视图不会更新。于是我实施了 sink 然后设置已发布的 出售 属性。所以 出售 汽车上的属性由切换开关设置,水槽将启动并设置模型。售出后,切换标签文本将更新。

    我怎样才能取消额外的费用呢 @Published var sold:Bool = false car.sold 所有物

    1 回复  |  直到 2 年前
        1
  •  1
  •   Asperi    2 年前

    直接观察汽车,它会确认观察到的物体,所以不用像观察模型那样在视图中传递

    struct CarView: View {
      @ObservedObject var car: Car