尝试绑定ObservableObject但无法分配给属性:“ XXXX”是仅获取属性,错误

时间:2020-08-25 03:58:35

标签: binding swiftui observableobject

我在Swift和SwiftUI上还很陌生,并且遇到了我无法理解的错误。

这是我通过Web服务使用JSON加载的类

class ResaListViewModel: ObservableObject {
    @Published var resasDeparts = [ResaViewModel]()
    
    init() {
        WSResa().getDeparts { resas in
            if let resas = resas as? [Resa] {
                self.resasDeparts = resas.map(ResaViewModel.init)
            }
        }
    }
}

class ResaViewModel: Identifiable, ObservableObject {
    @Published var resa: Resa
    
    init(resa: Resa) {
        self.resa = resa
    }
    
    var id: Int {
        return Int(self.resa.id)!
    }

 var nbveh: Int
    {
        return Int(self.resa.nbveh) ?? 0
    }
}

在视图中,我想绑定nbveh属性,并使用按钮对其进行递增和递减。

错误是:“无法分配给属性:'nbveh'是仅获取属性”

struct ResaDetail: View {
    @ObservedObject var resa:ResaViewModel
    
    var body: some View {
      vehiculeView(nbveh: $resa.nbveh)
}

struct ResaView: View {
    let resaListVM = ResaListViewModel()
    var body: some View {
        List(self.resaListVM.resasDeparts, id: \.id) { resa in
            NavigationLink(destination: ResaDetail(resa: resa)) {
                ResaList(resa: resa)
            }
        }
    } .navigationBarTitle(Text("Réservations"))
}

如何使该属性可编辑和可绑定?

感谢任何帮助

- Godefroy

2 个答案:

答案 0 :(得分:0)

问题是您的nbveh中的ResaViewModel属性是computed property。 SwiftUI中的Binding需要能够设置并获取值。由于计算属性的工作方式,您只能get个,而不能set个。

解决方案是将nbveh更改为此:

var nbveh: Int {
    get { return Int(resa.nbveh) ?? 0 }
    set { resa.nbveh = newValue }
}

这告诉Swift在读取值时执行get { }中的代码,并且在设置set { }时将执行nbveh。 这样,您就可以将其作为Binding

另一种解决方案可能是摆脱nbveh中的ResaViewModel变量,而只使用nbvehresa的{​​{1}}属性。看起来像这样:

ResaViewModel

答案 1 :(得分:0)

更改后发送消息并重新加载UI的答案是:

get { return Int(resa.nbveh) ?? 0 }
    set { resa.nbveh = String(newValue)
        objectWillChange.send()
    }

感谢您的帮助