使用UIButton数组检测哪个按钮被按下

7

我有一个像这样的 UIButton 数组:

@property (nonatomic, retain) IBOutletCollection(UIButton) NSArray *btn_Impact_Collection;

我有一个函数:

- (IBAction)impactAction:(id)sender;

在XIB文件中,我有九个按钮,每个按钮都与btn_Impact_Collection数组通过引用出口集合连接。此外,每个按钮的Touch_inside属性都连接到ImpactAction函数。
现在,当点击一个按钮时,会调用ImpactAction函数,但在该函数内部,如何知道按下了哪个按钮?
提前感谢您的答复!
4个回答

16

将sender强制转换为UIButton类,这将给您所点击的按钮实例。我没有Xcode,但是类似于以下代码:

if ([sender isMemberOfClass:[UIButton class]])
{
    UIButton *btn = (UIButton *)sender;

    // Then you can reference the title or a tag of the clicked button to do some further conditional logic if you want.
    if([btn.currentTitle isEqualToString:@"title of button"])
    {
        // do something.
    }
    else if(etc...)
}

1
谢谢,它有效。在我的情况下,我必须更改按下的按钮颜色。因此,只需使用以下代码即可:
  • (IBAction)impactAction:(id)sender{ UIButton *btn = (UIButton *)sender; [btn setBackgroundImage:[UIImage imageNamed:
    }
- benza
不需要检查发送者是否为特定类,因为选择器是通过IB链接的。 - cleverbit
1
或者,isKindOfClass:[UIButton class] - gdm
1
那一行代码确实应该改为: if ([sender isMemberOfClass:[UIButton class]]) { - james Burns

13

在界面构建器中为每个按钮设置标签(1-9),然后说:

if ([sender tag] == 1) {
//First button was pressed, react.
}
else if ([sender tag] == 2) {
//Second button was pressed, react.
}
// Etc...
else {
//Last button was pressed, react.
}

对于所有其他情况,也可以将其放入一个switch中。


非常感谢,但是这种方式我无法知道在所有按钮中哪个按钮被按下了。 - benza
@benza,根据我的理解,你正在使用Interface Builder,因此你需要为每个UIButton设置标签值才能使其正常工作。无论如何,发送操作的sender变量将是发送该操作的UIButton。 - mservidio
这种方法不太可扩展,因为你需要在IB中手动设置所有的标签(如果你需要在某个时候插入一个新按钮怎么办?)。此外,通常情况下,你应该尽可能避免长嵌套的if语句。 - cleverbit

3

不要对标题进行字符串检查(这很慢,也可能很繁琐),你可以:

- (void)buttonPressed:(id)sender
{
    for( UIButton *button in self.buttonCollection )
    {
        if( sender == button )
        {
            // sender is your button (eg. you can access its tag)
        }
    }
}

很棒的答案,其他答案展示了如何选择特定的按钮,但没有展示如何处理取消选择的按钮。谢谢。+1 - ICL1901

0

另一种选择是将发送者转换为UIButton,然后切换sender.tag:

if ([sender isMemberOfClass:[UIButton class]]) {
        switch ([sender tag]) {
            case 0:
                //do stuff for button with tag 0
                break;

            case 1:
                //do stuff for button with tag 1
                break;

            case 2:
                ....
                break;

            default:
                break;
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接