将不同的参数传递给IBAction

时间:2010-01-22 12:23:19

标签: ios objective-c cocoa-touch ibaction

我的iPhone应用程序有很多按钮,我希望所有按钮都调用相同的方法,但参数不同。

例如,我想点击一个按钮,使用参数myMethod:调用方法@"foo",第二个按钮应该使用参数@"bar"调用相同的方法。

7 个答案:

答案 0 :(得分:28)

所谓的“IBActions”必须具有以下签名之一:

-(void)action;
-(void)actionWithSender:(id)sender;
-(void)actionWithSender:(id)sender event:(UIEvent*)event;

您无法添加任何其他参数。不过你可以使用sender(在你的情况下是button1或button2)来获取参数:

-(void)actionWithSender:(UIButton*)sender {
   NSString* parameter;
   if (sender.tag == 1)   // button1
     parameter = @"foo";
   else                   // button2
     parameter = @"bar";
   ...
}

答案 1 :(得分:2)

真正的原因你无法添加额外的参数是UIKIT会在栈上推送params。 所以唯一的方法是使用标签。 一个DIRTY方法可以将指针转换为int并用它标记按钮:

myStruct params;
// fill params:
params.x=....
params.y=....
params.z=....


UIButton * btn = [UIButton......]; // create or use one from XIB
btn.tag = (int)&params;

... in Call back:
-(IBActions) doIt:(id)sender
{
  myStruct * paramsPtr = (myStruct*)tag;
  int i = paramsPtr->x;

注意:params必须保持静态..或使用malloc分配(越来越难看的代码......)。 不要使用本地var:它将在堆栈上分配,因此在退出setup方法后将被删除。

答案 2 :(得分:1)

为您的各种UIButton个实例提供不同的tag属性值。

IBAction方法-myMethod:中,您可能会执行以下操作:

- (void) myMethod:(id)sender {
    switch (sender.tag) {
        case (firstButtonTag):
           doFooStuff;
           break;
        case (secondButtonTag):
           doBarStuff;
           break;
        // etc.
    }
}

如果您想让维护更轻松,则firstButtonTagsecondButtonTag值可以存储在enum中。

答案 3 :(得分:1)

您无法通过IBAction传递参数。我通常做的是给按钮提供IB中的唯一标签。标签是一个整数值,因此我使用一个简单的查找表将标签转换为某个值。

在这种情况下,三个按钮,但标签1到3:

- (IBAction) buttonPressed: (UIButton*) sender
{
    static const NSString* names = { @"Foo", @"Bar", @"Baz" };
    id tag = [sender tag];
    if (tag >= 1 && tag <= 3) {
        NSLog(@"Button pressed is %@", names[tag]);
    }
}

答案 4 :(得分:1)

(id)发件人显示无论你在UIButton点击事件上传递的是什么,都直接传递给这个方法,无论它是什么类型,它都会自动像你传递按钮标签然后它将按钮标记作为sender.tag等

答案 5 :(得分:0)

正如其他人所说,您无法将自定义参数传递给操作方法。如果你不喜欢使用标签的解决方案,你也可以将UIButton子类化为自定义类,并在那里添加参数。 (我不会打扰,只是使用标签)

答案 6 :(得分:-1)

你没有。唯一的参数是发送者对象,您可以使用它来获得不同的行为,但我要做的是定义2个动作方法,这些方法只是依次用不同的参数调用相同的方法,即你有:< / p>

- (IBAction)button1:(id)sender
{
    [self doStuff:kButton1];
}

- (IBAction)button2:(id)sender
{
    [self doStuff:kButton2];
}

- (void)doStuff:(ParamType)param;
{
    ...
}

为了保护这种方法(没有双关语),我补充一点,当你用Interface Builder查看你的用户界面时,它会更清楚地看到不同的按钮实际上有不同的效果,如果他们都调用了whatAction则更难判断: