SwiftUI:循环内按钮颜色的更改

时间:2020-07-18 17:30:41

标签: ios xcode swiftui

我的代码如下:

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()
    }
}

我要根据颜色数组更改按钮的颜色。在正常情况下,它可以正常工作,我可以一一选择按钮,然后更改颜色。但是,如果我单击一个已经单击的按钮,则它会按预期变为白色,但其他按钮的颜色会发生变化。再次单击已选择的按钮时,我不想更改其他按钮的颜色。

1 个答案:

答案 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)
            }
        }
    }
}