【问题标题】:Selecting and deselecting collection of buttons选择和取消选择按钮集合
【发布时间】:2018-08-17 10:41:23
【问题描述】:

我有三个名为 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 成为redOne 作为white。我做了上述但它允许multiple selection 并且不能deselect 以前的更改。我该如何解决?

【问题讨论】:

  • 您需要在选择任何其他按钮之前取消选择所有按钮
  • 所以,在这种情况下,我必须为每个按钮创建单独的插座。有没有办法,我可以在不为每个按钮创建单独的插座的情况下做到这一点?
  • 你可以看到我的答案,或者有一个叫做IBOutletCollection 的东西,它会让你的代码看起来更干净,所有按钮只有一个插座

标签: ios swift xcode uibutton


【解决方案1】:

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

@IBOutlet var buttons: [UIButton]!

使用上述集合并将所有按钮与 Outlet 连接。还将下面的操作与所有按钮连接起来。

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

【讨论】:

  • 这就是我要找的。很好的解释:)
  • buttons[sender.tag] 有效吗?我的印象是奥特莱斯系列没有特定的顺序。
  • This question and top answer 讨论这个问题。显然,出口集合确实有一个订单,但依赖该订单是一种不好的做法,因为没有办法验证它。
  • 最后,sender.setTitleColor(.red, for: .normal)sender.isSelected = false 还不够。 sender 在插座集合中的哪个位置无关紧要。
  • @vacawama,如果我们给按钮提供标签号,它不起作用吗?
【解决方案2】:

由于您目前只突出显示一个按钮,因此您不需要标签数组而是对所有按钮的引用。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-25
    • 1970-01-01
    • 2011-07-17
    • 2020-03-26
    • 2013-10-01
    • 2012-02-21
    • 1970-01-01
    相关资源
    最近更新 更多