将不同的parameter passing给IBAction

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

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

所谓的“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"; ... } 

真正的原因你不能添加额外的参数是UIKIT会推栈上的参数。 所以唯一的办法是使用标签。 DIRTY的方法可以是将指针转换为int并用它标记button:

 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分配(越来越丑陋的代码…)。 不要使用局部variables:它将被分配到栈上,所以在从设置方法退出后将被删除。

给你的各种UIButton实例不同的tag属性值。

在你的IBAction方法中, -myMethod:你可能会这样做:

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

firstButtonTagsecondButtonTag的值可以存储在一个enum如果你想使这个维护更容易。

你不能通过IBAction传递参数。 我通常做的是给button在IB的唯一标签。 标签是一个整数值,所以我然后用一个简单的查找表将标签转换为某个值。

在这种情况下,三个button,但标签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]); } } 

(id)发件人是显示,无论你通过UIButton点击事件是直接传递给这个方法,不pipe它是什么types,它会自动如果你通过button标签然后它采取button标签为sender.tag等

正如其他人所提到的,你不能将你的自定义parameter passing给操作方法。 如果你不喜欢使用标签的解决scheme,你也可以用你的自定义类inheritanceUIButton,并在那里添加你的参数。 (我不会打扰,只是使用标签)

你没有。 唯一的参数是发送者对象,您可能会使用它来具有不同的行为,但是我要做的是定义2个操作方法,它们依次调用具有不同参数的相同方法,即:

 - (IBAction)button1:(id)sender { [self doStuff:kButton1]; } - (IBAction)button2:(id)sender { [self doStuff:kButton2]; } - (void)doStuff:(ParamType)param; { ... } 

为了防止这种方法(没有双关意图),我想补充一点,当你使用界面生成器来查看你的用户界面,看到不同的button实际上有不同的效果时,它会变得更清晰,如果他们都调用任何操作,