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

问题描述

按钮方法

@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,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,alpha: 1)
    }
    
    else {
        button.backgroundColor = #colorLiteral(red: 0.7620294414,green: 0.05229266211,blue: 0.09308676813,alpha: 1)
    }
    

}

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

提前致谢。

解决方法

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

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

逻辑: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,#colorLiteral(red: 0.6805654408,green: 0.1003367522,blue: 0.09689761347,#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,alpha: 1)
        case 3: sender.backgroundColor = #colorLiteral(red: 0.1123025946,alpha: 1)
        default: break
    }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...