我有三个分别名为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,
,我希望One
是red
,然后当我按下Two
时,我希望Two
是red
和{ {1}}为One
。我做了上面的工作,但是它允许white
并且不能multiple selection
以前的更改。我该如何解决?
答案 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)
}