我正在根据获取的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中执行此按钮切换效果?
答案 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)
}