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

问题描述

按钮方法

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

}

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

先感谢您。

标签: swiftxcodeuibutton

解决方案


正如我在评论中所说,该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, 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
    }
}

推荐阅读