我的iPhone应用程序有很多按钮,我希望所有按钮都调用相同的方法,但参数不同。
例如,我想点击一个按钮,使用参数myMethod:
调用方法@"foo"
,第二个按钮应该使用参数@"bar"
调用相同的方法。
答案 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)¶ms;
... 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.
}
}
如果您想让维护更轻松,则firstButtonTag
和secondButtonTag
值可以存储在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则更难判断: