【发布时间】:2020-03-13 23:02:06
【问题描述】:
我正在制作一个包含 5 个带有单选按钮的选项的页面。当我们点击一个选项时,元素的颜色应该会改变。我正在从 API 响应中获取这些选项。我正在使用 MVVM 模型。我附上下面的代码。
我正在苦苦挣扎的是,当我更改布尔值时,它并没有改变!!!
查看模型代码
import Foundation
import Combine
class DCListViewModel: ObservableObject {
@Published var DCList = [DCViewModel]()
init() {
fetchDcs()
}
func fetchDcs() {
ARMServices().getAllDc { (dcArr) in
if let dcArr = dcArr {
for dc in dcArr{
self.DCList.append(DCViewModel(dc: dc, isSelected: false))
}
}
}
}
}
class DCViewModel {
var id = UUID()
var dcStruct: DC
var isSelected: Bool
init(dc: DC, isSelected: Bool) {
self.dcStruct = dc
self.isSelected = isSelected
}
var url: String {
return self.dcStruct.url ?? "empty URL"
}
var dc: String {
return self.dcStruct.dc ?? "empty dc name"
}
}
查看页面代码
struct SelectTableView: View {
var body: some View {
NavigationView {
VStack {
DCListView(dcList: self.dcListVM.DCList)
.padding(.horizontal)
}
.navigationBarTitle("Select the Data Centre")
}
}
}
struct DCListView: View{
var dcList: [DCViewModel]
init(dcList: [DCViewModel]) {
self.dcList = dcList
}
var body: some View {
ForEach(self.dcList, id: \.id) { dc in
Button(action: {
print("Tapped")
dc.isSelected.toggle()
}){
ZStack {
RoundedRectangle(cornerRadius: 8)
.stroke(dc.isSelected ? Color.init("borderSelected"): Color.init("border"))
.frame(height: 56)
.foregroundColor(.clear)
HStack {
Text(dc.dc)
.font(.custom("Montserrat", size: 16))
.fontWeight(.medium)
.foregroundColor(dc.isSelected ? Color.init("borderSelected") : .white)
.padding()
Spacer()
ZStack {
Circle()
.stroke(dc.isSelected ? Color.init("borderSelected") : Color("circleBorder"))
.frame(width: 18, height: 18)
.padding()
Circle()
.frame(width: 10, height: 10)
.foregroundColor(dc.isSelected ? Color.init("borderSelected"): Color.clear)
}
}
}
}
}
}
}
【问题讨论】: