检查哪个UIButton被点击了

时间:2014-01-18 14:18:24

标签: ios objective-c uibutton

我创建了几个这样的按钮:

[self makeButtonsWithX:0.0f y:180.0f width:640.0f height:80.0f color:[UIColor colorWithRed:0.796 green:0.282 blue:0.196 alpha:1] button:self.redButton];

    [self makeButtonsWithX:0.0f y:260.0f width:640.0f height:80.0f color:[UIColor colorWithRed:0.761 green:0.631 blue:0.184 alpha:1] button:self.yellowButton];

使用此功能:

- (void)makeButtonsWithX:(CGFloat)x y:(CGFloat)y width:(CGFloat)width height:(CGFloat)height color:(UIColor *)color button:(UIButton *)button
{
    button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    button.frame = CGRectMake(x, y, width, height);
    button.backgroundColor = color;
    [self.view addSubview:button];

    [button addTarget:self action:@selector(tappedButton:) forControlEvents:UIControlEventTouchUpInside];
}

当我点击其中一个时,我想知道哪个被点击,使用此功能:

- (void)tappedButton:(UIButton *)button
{
    //NSLog(@"tapped");
    if ([button isEqual:self.redButton]) {
        NSLog(@"Red");
    }
}

什么都没发生。但是,如果我在最后一个函数中取消注释第一个NSLog,则每次按下按钮时都会打印(无论哪个都无关紧要)。为什么我的if语句不起作用?

干杯。

2 个答案:

答案 0 :(得分:1)

创建按钮时,请为其指定唯一标记。

tappedButton:方法更改为:

- (void)tappedButton:(id)sender {
    if([sender tag] == 1) {
        NSLog(@"Red");
    }
}

我可能会为代码创建一个enum

typedef NS_ENUM(NSUInteger, ButtonTags) {
    ButtonUnknown = 100,
    ButtonRedTag = 101,
    ButtonBlueTag = 102,
    ButtonGreenTag = 103,
    ButtonYellowTag = 104,
    ButtonWhiteTag = 105
};

现在在设置和检查标签时使用enum

if([sender tag] == ButtonRedTag)

设置标记:

[button setTag:ButtonRedTag];

可能有另一种方法可以确定按下哪个按钮,但就我而言,使用[sender tag];是最好的方法。考虑一下......假设您想要在按下按钮或文本字段已重新响应第一响应者时调用方法?例如,想象一个登录页面,其中包含用户名/密码文本字段和用于登录的按钮并创建新帐户。使用sender标签,您可以轻松地使所有UI元素至少以相同的方法开始:

- (void)handleUserInteraction:(id)sender {
    switch([sender tag]) {
        case LoginButtonTag:
            // do stuff
            break;
        case PasswordTextFieldTag:
            // do stuff
            break;
        case NewAccountButtonTag:
            // do stuff
            break;
        case BackgroundViewTappedTag:
            // do stuff
            break;
    }
}

首先将所有这些UI元素挂钩到不同的方法可能更有意义,当然,在switch内,它们应该调用不同的方法,但是假设有一些你想在所有这四种情况下执行的逻辑?把它放在switch之前或之后,而不是把它放在你为处理这些不同情况而创建的所有4种方法中等等。

答案 1 :(得分:0)

此外,您无法通过引用传递“制作”按钮。你拨打makeButtonsWithX的方式不会改变self.redButton if语句中的self.redButton将为nil 将make ButtonsWithX的返回类型从(void)更改为(UIButton *),并执行以下操作:

self.redButton = [self makeButtonsWithX: ...