簡(jiǎn)單的問(wèn)題,但我可能忘記了一些代碼。讓我們用圖像更好地解釋一下:
我需要基本上更新“計(jì)數(shù)”和“價(jià)格”,而選擇/取消選擇項(xiàng)目。
我有這樣的代碼結(jié)構(gòu):
Model:
class ServiceSelectorModel: Identifiable, ObservableObject {
var id = UUID()
var serviceName: String
var price: Double
init(serviceName: String, price: Double) {
self.serviceName = serviceName
self.price = price
}
@Published var selected: Bool = false
}
ViewModel:
class ServiceSelectorViewModel: ObservableObject {
@Published var services = [ServiceSelectorModel]()
init() {
self.services = [
ServiceSelectorModel(serviceName: "SERVICE 1", price: 1.80),
ServiceSelectorModel(serviceName: "SERVICE 2", price: 10.22),
ServiceSelectorModel(serviceName: "SERVICE 3", price: 2.55)
]
}
}
ToggleView
struct ServiceToggleView: View {
@ObservedObject var model: ServiceSelectorModel
var body: some View {
VStack(alignment: .center) {
HStack {
Text(model.serviceName)
Toggle(isOn: $model.selected) {
Text(String(format: "€ +%.2f", model.price))
.frame(maxWidth: .infinity, alignment: .trailing)
}
}
.background(model.selected ? Color.yellow : Color.clear)
}
}
}
ServiceSelectorView
struct ServiceSelectorView: View {
@ObservedObject var serviceSelectorVM = ServiceSelectorViewModel()
var body: some View {
VStack {
VStack(alignment: .leading) {
ForEach (serviceSelectorVM.services, id: \.id) { service in
ServiceToggleView(model: service)
}
}
let price = serviceSelectorVM.services.filter{ $0.selected }.map{ $0.price }.reduce(0, +)
Text("SELECTED: \(serviceSelectorVM.services.filter{ $0.selected }.count)")
Text(String(format: "TOTAL PRICE: €%.2f", price))
}
}
}
在這段代碼中,我可以更新模型的selected
狀態(tài),但是視圖模型包含所有模型,應(yīng)該刷新PRICE
而不是更新。似乎數(shù)組中的模型沒(méi)有改變。
我忘了什么?
最簡(jiǎn)單的方法可能是將您的模型設(shè)為值類型,然后更改它的屬性,持有它的視圖模型將被更新。以及更新視圖以使用對(duì)這些值的綁定
注意:內(nèi)聯(lián)編寫(xiě),未經(jīng)測(cè)試,可能需要修復(fù)某些拼寫(xiě)錯(cuò)誤