通过操作发送值:@selector

时间:2015-01-19 19:18:55

标签: ios objective-c

我的代码:

    UIButton *boutonSuppr = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    boutonSuppr.frame = rectBoutonSuppr;
    [boutonSuppr setBackgroundImage: [UIImage imageNamed:@"croixTest.png"] forState:UIControlStateNormal];
    [monScrollView addSubview: boutonSuppr];
    int numb = 10;
    [boutonSuppr addTarget:self action:@selector(boutonSupprAppuye) forControlEvents:UIControlEventTouchUpInside];

我的方法声明:- (void)boutonSupprAppuye:(int) numero;

我的问题是我需要在方法中发送一个参数,因为我有几个UIButton。例如,我想发送"(int)numb"但是当我这样做时:

[boutonSuppr addTarget:self action:@selector(boutonSupprAppuye:numero) forControlEvents:UIControlEventTouchUpInside];

它没有用。

提前谢谢。

3 个答案:

答案 0 :(得分:1)

如果您真的只是使用int来识别被击中的按钮,您应该只在Interface Builder中为按钮设置唯一标签,或者在代码中创建它们时,设置相应的枚举然后在您的命中方法中,像这样处理。标签已经在每个UIView中可用,并且专门为此目的而设计。

typedef NS_ENUM(NSInteger, ButtonTag) {
    e_buttonTag_unknown = 0,
    e_buttonTag_doThing1Button,    /* 1 */
    e_buttonTag_doThing2Button     /* 2 */
};

...
    // Add this to the button creation code you posted
    boutonSuppr.tag = e_buttonTag_doThing1Button;

    // and set the button's action to @selector(buttonTapped:).
...

- (IBAction) buttonTapped: (id) sender
{
    UIButton    *whichButton = (UIButton *) sender;
    ButtonTag   whichTag = whichButton.tag;

    switch (whichTag)
    {
        case e_buttonTag_doThing1Button:
            // "Do thing 1" button was pressed.
            break;
        case e_buttonTag_doThing2Button:
            // "Do thing 2" button was pressed.
            break;
        default:
            // Some other button was pressed.
            break;
    }
}

答案 1 :(得分:0)

声明@selector()时,可以认为它与函数指针相同。它当时没有参数;它在调用选择器时需要参数。

当收到UIButton事件时,UIControlEventTouchUpInside类将调用此特定选择器。这意味着执行将远离您的源代码,并且传递给它的任何参数将由系统自动完成。


如果您想将数据附加到UIButton,最简单的方法是使用@property

@interface MyButton : UIButton
@property (assign) int numero;
@end
@implementation MyButton
@end

然后你的构造变成:

MyButton *boutonSuppr = [MyButton buttonWithType:UIButtonTypeRoundedRect];
boutonSuppr.numero = numero;
// etc.

答案 2 :(得分:0)

动作方法应该将对象指针作为参数。 通常这是类型id,但有时是更具体的对象。 关键是它是一个指针,这意味着如果传入指针,你可以在C中填充任何东西。 为方便起见,只需使用一个对象并将值包装在对象中。 您可以将NSValue用于任何C类型包装器或NSNumber用于标量