我的代码如下:
struct ContentView: View {
@State var selectedButtons: [Int] = []
func updateButtons(value: Int) {
if selectedButtons.count < 5 {
if let index = self.selectedButtons.firstIndex(of: value) {
self.selectedButtons.remove(at: index)
} else if selectedButtons.count < 5 {
self.selectedButtons.append(value)
}
} else if selectedButtons.count >= 5 && selectedButtons.firstIndex(of: value) != nil {
if let index = selectedButtons.firstIndex(of: value) {
self.selectedButtons.remove(at: index)
}
}
}
func buttonColor(value: Int) -> Color {
if let index = selectedButtons.firstIndex(of: value), index < colors.count {
return colors[index]
} else {
return .white
}
}
var body: some View {
VStack(alignment: .center, spacing: 15) {
ForEach(0 ..< 7) { index in
Button(action: {
self.updateButtons(value: index)
}) {
Text(" ")
}
.frame(width: 100, height: 50)
.background(self.buttonColor(value: index))
.foregroundColor(Color.black)
.cornerRadius(10)
.shadow(radius: 2)
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
我要根据颜色数组更改按钮的颜色。在正常情况下,它可以正常工作,我可以一一选择按钮,然后更改颜色。但是,如果我单击一个已经单击的按钮,则它会按预期变为白色,但其他按钮的颜色会发生变化。再次单击已选择的按钮时,我不想更改其他按钮的颜色。
答案 0 :(得分:0)
这是固定的逻辑,并且降低了复杂性。同样,使用不同的数组进行迭代也是不安全的,如果元素数量不同,可能会导致崩溃。为了安全起见,请改用结构模型。为了简单起见,我在这里遍历了colors
。您可以根据需要将其替换为模型。
struct ContentView: View {
@State var selectedButtonColors = [Color]()
let colors: [Color] = [.blue, .gray, .green, .orange, .pink, .purple, .red]
var body: some View {
VStack(alignment: .center, spacing: 15) {
ForEach(colors, id: \.self) { color in
Button(action: {
if let index = self.selectedButtonColors.firstIndex(of: color) {
self.selectedButtonColors.remove(at: index)
} else {
self.selectedButtonColors.append(color)
}
}) {
Text(" ")
}
.frame(width: 100, height: 50)
.background(self.selectedButtonColors.contains(color) ? color : .white)
.foregroundColor(Color.black)
.cornerRadius(10)
.shadow(radius: 2)
}
}
}
}