问题的标签系统不起作用,因为交换更改仅发生在最后一个按钮上

The tag system for the question isn't working as the exchange change only occurs on the last button

按钮方法

@objc func buttonFuction(){
        
        let stacView = UIStackView()
        stacView.spacing = 12
        stacView.distribution = .fillEqually
        stacView.axis = .horizontal
        stacView.translatesAutoresizingMaskIntoConstraints = false
        view!.addSubview(stacView)
        
        buttonNames = ["One","Two","Three","Four"]
        
        for i in 0..<buttonNames.count{
            
            index+=i
            button = Button()
            button.setTitle(buttonNames[i], for: .normal)
            stacView.addArrangedSubview(button)
            buttons.append(button)
            button.tag = index
            button.addTarget(self, action: selectors[i], for: .touchUpInside)
            button.addTarget(self, action: selectorsColor[i], for: .touchDown)
        }
    
        NSLayoutConstraint.activate([stacView.centerXAnchor.constraint(equalTo: view!.centerXAnchor),stacView.centerYAnchor.constraint(equalTo: view!.centerYAnchor),stacView.widthAnchor.constraint(equalToConstant: 350),stacView.heightAnchor.constraint(equalToConstant:70)])
        
}

按钮处理程序方法

@objc func colorButton1(){
    
    if button.tag == 0 {
        button.backgroundColor = #colorLiteral(red: 0.1123025946, green: 1, blue: 0.03079073749, alpha: 1)
    }
    
    else {
        button.backgroundColor = #colorLiteral(red: 0.7974829231, green: 0.09321228972, blue: 0.09321228972, alpha: 1)
    }
    
}

@objc func colorButton2(){
    
    if button.tag == 1 {
        button.backgroundColor = #colorLiteral(red: 0.07117979832, green: 0.8973241221, blue: 0, alpha: 1)
    }
 
    else {
        button.backgroundColor = #colorLiteral(red: 0.7312681945, green: 0.1133923198, blue: 0.06002510149, alpha: 1)
    }
    
}

@objc func colorButton3(){
    
    if button.tag == 2 {
        button.backgroundColor = #colorLiteral(red: 0.1123025946, green: 1, blue: 0.03079073749, alpha: 1)
    }
    
    else {
        button.backgroundColor = #colorLiteral(red: 0.6805654408, green: 0.1003367522, blue: 0.09689761347, alpha: 1)
    }
    
}

@objc func colorButton4(){
    
    if button.tag == 3 {
        button.backgroundColor = #colorLiteral(red: 0.1123025946, green: 1, blue: 0.03079073749, alpha: 1)
    }
    
    else {
        button.backgroundColor = #colorLiteral(red: 0.7620294414, green: 0.05229266211, blue: 0.09308676813, alpha: 1)
    }
    

}

每次我按下按钮时,它都会不断改变最后一个按钮的颜色,即使在标记每个按钮之后,颜色变化只发生在最后一个按钮中,并且不确定如何更改代码以允许颜色变化发生按下时在其他按钮上。

提前致谢。

正如我在评论中所说,buttons 数组包含 4 个项目,由于引用语义,它们都指向同一个实例,即最后添加的 Button 实例。 button 属性.

也是如此

你需要这样的东西,它创建了四个 different Button 实例并使用 one 操作方法,我不知道我不知道第二个选择器是做什么的,所以我把它注释掉了。

逻辑:sender参数是刚刚点击的按钮,首先设置所有背景颜色除了当前按钮为合适的红色,然后设置背景当前按钮的颜色为绿色。对按钮的引用取自 buttons 数组。

for i in 0..<buttonNames.count{
    let button = Button()
    button.setTitle(buttonNames[i], for: .normal)
    stacView.addArrangedSubview(button)
    buttons.append(button)
    button.tag = i
    button.addTarget(self, action: #selector(colorButton), for: .touchUpInside)
    // button.addTarget(self, action: selectorsColor[i], for: .touchDown)
}

@objc func colorButton(_ sender : Button) {
    let offColors = [#colorLiteral(red: 0.7974829231, green: 0.09321228972, blue: 0.09321228972, alpha: 1),
                     #colorLiteral(red: 0.7312681945, green: 0.1133923198, blue: 0.06002510149, alpha: 1),
                     #colorLiteral(red: 0.6805654408, green: 0.1003367522, blue: 0.09689761347, alpha: 1),
                     #colorLiteral(red: 0.7620294414, green: 0.05229266211, blue: 0.09308676813, alpha: 1)]
    for i in 0..<4 where i != sender.tag {
        buttons[i].backgroundColor = offColors[i]
    }
    switch sender.tag {
        case 0: sender.backgroundColor = #colorLiteral(red: 0.1123025946, green: 1, blue: 0.03079073749, alpha: 1)
        case 1: sender.backgroundColor = #colorLiteral(red: 0.07117979832, green: 0.8973241221, blue: 0, alpha: 1)
        case 2: sender.backgroundColor = #colorLiteral(red: 0.1123025946, green: 1, blue: 0.03079073749, alpha: 1)
        case 3: sender.backgroundColor = #colorLiteral(red: 0.1123025946, green: 1, blue: 0.03079073749, alpha: 1)
        default: break
    }
}