我不确定为什么当我有一个嵌套在另一个视图模型中的视图模型时,我的视图没有得到更新。我的理解是,在子视图模型中的@Published属性会触发父ViewModel的变化,从而导致其推送更改到UI。
这是子视图模型:
class FilterViewModel : ObservableObject, Identifiable {
var id = UUID().uuidString
var name = ""
var backgroundColour = ""
@Published var selected = false
private var cancellables = Set<AnyCancellable>()
init(name: String){
self.name = name
$selected.map { _ in
self.selected ? "Orange" : "LightGray"
}
.assign(to: \.backgroundColour, on: self)
.store(in: &cancellables)
}
func changeSelected() {
self.selected = !self.selected
}
}
以下内容符合预期,点击按钮后背景颜色会发生变化。
struct ContentView: View {
@ObservedObject var filterVM = FilterViewModel(name: "A")
Button(action: { filterVM.changeSelected()}, label: {
Text(filterVM.name)
.background(Color(filterVM.backgroundColour))
})
}
然而,我希望拥有一个过滤器视图模型的数组,因此尝试了以下代码:
class FilterListViewModel: ObservableObject {
@Published var filtersVMS = [FilterViewModel]()
init(){
filtersVMS = [
FilterViewModel(name: "A"),
FilterViewModel(name: "B"),
FilterViewModel(name: "C"),
FilterViewModel(name: "D")
]
}
}
然而,点击按钮后以下视图未更新。
struct ContentView: View {
@ObservedObject var filterListVM = FilterListViewModel()
Button(action: { filterListVM[0].changeSelected()}, label: {
Text(filterListVM[0].name)
.background(Color(filterListVM[0].backgroundColour))
})
}