SwiftUI-在視圖模型數(shù)組中更新的模型上刷新視圖

簡(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ì)這些值的綁定

struct ServiceSelectorModel: Identifiable {
    var id = UUID()

    var serviceName: String
    var price: Double
    
    init(serviceName: String, price: Double) {
        self.serviceName = serviceName
        self.price = price
    }

    var selected: Bool = false
}

struct ServiceToggleView: View {
    @Binding var model: ServiceSelectorModel
...
}

...

ForEach (serviceSelectorVM.services.indices, id: \.self) { i in
    ServiceToggleView(model: $serviceSelectorVM.services[i])
}

注意:內(nèi)聯(lián)編寫(xiě),未經(jīng)測(cè)試,可能需要修復(fù)某些拼寫(xiě)錯(cuò)誤

主站蜘蛛池模板: 免费看AV毛片一区二区三区| 无码国产精品一区二区免费式芒果 | 久久久无码精品国产一区 | 成人一区二区三区视频在线观看| 中文字幕日韩丝袜一区| 亚洲AV无码一区二三区| 国产成人精品久久一区二区三区| 亚洲国产成人精品久久久国产成人一区二区三区综 | 无码乱码av天堂一区二区| av无码精品一区二区三区四区| 波多野结衣一区二区| 亚洲欧洲一区二区| 日韩免费视频一区二区| 农村人乱弄一区二区| 日韩人妻无码一区二区三区久久99 | 国产福利91精品一区二区三区| 中文字幕永久一区二区三区在线观看| 国产三级一区二区三区| 精品国产一区二区三区香蕉事 | 亚洲AV无码一区二区乱子伦| 99精品久久精品一区二区| 无码日韩人妻AV一区二区三区| 成人国产精品一区二区网站公司| 97精品一区二区视频在线观看| 少妇精品久久久一区二区三区| 亚洲成AV人片一区二区| 亚洲国产综合精品中文第一区| 中文字幕日韩一区二区三区不卡| 一区二区三区四区精品视频| 色偷偷av一区二区三区| 肉色超薄丝袜脚交一区二区| 97av麻豆蜜桃一区二区| 国产精品一区视频| 在线精品一区二区三区电影| 色婷婷av一区二区三区仙踪林| 亚洲av无一区二区三区| 国产一区二区三区在线免费观看| 日韩精品一区二区午夜成人版| 区三区激情福利综合中文字幕在线一区亚洲视频1 | 综合一区自拍亚洲综合图区| 无码av中文一区二区三区桃花岛|