一次只激活一个按钮

时间:2016-04-28 08:47:51

标签: ios swift

我正在根据获取的x数据动态创建x个按钮。

我想一次只激活一个按钮。 假设有3个按钮名为 A B C 。 当用户点击 B A 处于活动状态时,我想停用 A 并激活 B

这样在jQuery中很容易实现

$(this).toggleClass('checked').siblings().removeClass('checked');

如何在Swift中执行此操作?

我正在使用以下内容创建按钮:

let frame1 = CGRect(x: 10, y: 6, width: 50, height: 30 )
let button1 = UIButton(frame: frame1)
let attributedTitle = NSAttributedString(string: "\(distinctCategories[i])".uppercaseString, attributes: [NSKernAttributeName: 1.0, NSForegroundColorAttributeName: UIColor.blackColor()])
button1.setAttributedTitle(attributedTitle, forState: .Normal)
button1.titleLabel!.font = UIFont(name: "HelveticaNeue", size: 13.0)
button1.layer.borderWidth = 2.0
button1.layer.borderColor = UIColor.blackColor().CGColor
button1.backgroundColor = UIColor.whiteColor()
button1.addTarget(self, action: "filterByCategory:", forControlEvents: UIControlEvents.TouchUpInside)
self.categoryScrollView.addSubview(button1)

在我的目标行动中:

func filterByCategory(sender:UIButton) {

    if sender.backgroundColor != UIColor.blackColor() {

        let attributedTitle = NSAttributedString(string: "\((sender.titleLabel?.text)!)".uppercaseString, attributes: [NSKernAttributeName: 1.0, NSForegroundColorAttributeName: UIColor.whiteColor()])
        sender.setAttributedTitle(attributedTitle, forState: .Selected)
        sender.backgroundColor = UIColor.blackColor()
    } else {

        let attributedTitle = NSAttributedString(string: "\((sender.titleLabel?.text)!)".uppercaseString, attributes: [NSKernAttributeName: 1.0, NSForegroundColorAttributeName: UIColor.blackColor()])
        sender.setAttributedTitle(attributedTitle, forState: .Normal)
        sender.backgroundColor = UIColor.whiteColor()
    }
}

我只是为了简洁而展示了样式的变化。 目前我只处理发送者按钮样式的切换,而不是切换兄弟按钮。

要反转兄弟按钮的样式,我尝试在上面的if内添加它。

for button in categoryScrollView.subviews {
    if let button = button as? UIButton {
        let attributedTitle = NSAttributedString(string: " ", attributes: [NSKernAttributeName: 1.0, NSForegroundColorAttributeName: UIColor.blackColor()])      
        button.setAttributedTitle(attributedTitle, forState: .Normal)
        button.backgroundColor = UIColor.whiteColor()
     }
 }

但是我不确定我是否正确这样做,因为我需要在setAttributedTitle()的目标函数中再次添加所有按钮标题

其他人如何在Swift中执行此按钮切换效果?

2 个答案:

答案 0 :(得分:7)

我相信你需要的是在iOS中实现单选按钮。

这可以使用UITableView轻松完成。如果您的要求是在UIScrollView中使用UIButtons,那么您可以将这些UIButton对象存储在一个数组中并访问它们以实现效果。

假设您有三个UIButtons A,B,C。在将它们添加到数组之前,将它们的属性设置为.Selected和.Normal状态。您可以将其中一个设置为“活动”作为初始状态。另外,为它们设置唯一标记以供参考

创建这些按钮时,将它们添加到数组中(比如按钮数组)。然后在func filterByCategory(sender:UIButton)中,执行以下操作

func filterByCategory(sender:UIButton) {

    sender.selected = true
    for item in array {
        if item.tag != sender.tag {
           item.selected = false
        }
    }
}

P.S:如果您想知道使用UITableView执行此操作的方法,可以在评论中ping我

答案 1 :(得分:2)

建议使用变量来保存对当前按钮的引用。

好处是:没有按钮数组,也没有重复循环。

  • 创建UIButton变量currentButton

    var currentButton : UIButton!
    
  • 编写一个方法来重置当前属性并设置所选按钮的属性。

    func selectButton(button: UIButton) {
        if button === currentButton { return }           
    
        // add the code to reset the attributes of 'currentButton'
    
        // add the code to set the attributes of 'button'
    
        currentButton = button
    }  
    
  • 创建按钮后,将选定的属性添加到其中一个,并相应地设置currentButton

  • 点击按钮时,请调用方法

    func filterByCategory(sender:UIButton) {
       selectButton(sender)
    }