将不同的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)¶ms; ... 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. } }
firstButtonTag
和secondButtonTag
的值可以存储在一个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实际上有不同的效果时,它会变得更清晰,如果他们都调用任何操作,