选择和取消选择按钮集合

时间:2018-08-17 10:41:23

标签: ios swift xcode uibutton

我有三个分别名为One, Two,Three,的按钮,以及一个用于收集这三个按钮的函数buttonPressed,如下所示。

var btnTag = [Int]()

@IBAction func buttonPressed(_ sender: UIButton) {

    guard let button = sender as UIButton? else { return }
    if(btnTag.contains((sender as AnyObject).tag!))
    {
        if let index = btnTag.index(of: (sender as AnyObject).tag!)
        {
            btnTag.remove(at: index)
        }
    }
    else
    {
       btnTag.append((sender as AnyObject).tag!)
    }

    if !button.isSelected {
        button.isSelected = true
        button.setTitleColor(.red, for: .normal)
    }
    else
    {
        button.isSelected = false
        button.setTitleColor(.white, for: .normal)
    }
}

我喜欢在单击时将按钮的颜色更改为red,然后在单击其他按钮时将前一个按钮的颜色更改为white。因此,如果我按One,,我希望Onered,然后当我按下Two时,我希望Twored和{ {1}}为One。我做了上面的工作,但是它允许white并且不能multiple selection以前的更改。我该如何解决?

2 个答案:

答案 0 :(得分:3)

您可以简单地创建UIButton的集合。之后,从情节提要中分配所有三个UIButton的标签。

@IBOutlet var buttons: [UIButton]!

使用上面的集合并将所有按钮与插座连接。还可以使用所有按钮在动作下方进行连接。

@IBAction func buttonPressed(_ sender: UIButton) {
    buttons.forEach { $0.isSelected = false
        $0.setTitleColor(.white, for: .normal)
    }

    buttons[sender.tag].setTitleColor(.red, for: .normal)
    buttons[sender.tag].isSelected = true
}

答案 1 :(得分:1)

由于您当前仅突出显示一个按钮,因此不需要标签数组,而无需引用所有按钮。

//Let say these are my button refrence
@IBOutlet weak var button1: UIButton!
@IBOutlet weak var button2: UIButton!
@IBOutlet weak var button3: UIButton!

所有这些按钮都针对相同的方法

@IBAction func buttonPressed(_ sender: UIButton) {

     //clear all button selected state
     clearSelectedState()

     //select the button that was clicked
     sender.isSelected = true
     sender.setTitleColor(.red, for: .normal)
}


func clearSelectedState() {

     button1.isSelected = false
     button1.setTitleColor(.white, for: .normal)

     .... proceed to do for others
}

现在在clearSelectedState方法中,我不喜欢重复代码。所以我们可以做的就是将引用放入数组中,然后做类似的事情

///this can be replaced in clear state method
[button1, button2, button3,...].forEach {
       $0.isSelected = false
       $0.setTitleColor(.white, for: .normal)
}