我的 iPhone 应用程序有很多按钮,我希望所有按钮都调用相同的方法,但参数不同。
例如,我想点击一个按钮来调用myMethod:
带有参数的方法@"foo"
,而第二个按钮应该调用相同的方法但带有参数@"bar"
。
我的 iPhone 应用程序有很多按钮,我希望所有按钮都调用相同的方法,但参数不同。
例如,我想点击一个按钮来调用myMethod:
带有参数的方法@"foo"
,而第二个按钮应该调用相同的方法但带有参数@"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 并用它标记按钮:
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;
注意:参数必须保持静态..或使用 malloc 分配(越来越丑陋的代码......)。不要使用本地 var:它将在堆栈上分配,因此在退出 setup 方法后将被删除。
为您的各种UIButton
实例提供不同的tag
属性值。
在您的IBAction
方法-myMethod:
中,您可能会执行以下操作:
- (void) myMethod:(id)sender {
switch (sender.tag) {
case (firstButtonTag):
doFooStuff;
break;
case (secondButtonTag):
doBarStuff;
break;
// etc.
}
}
如果您想让它易于维护firstButtonTag
,secondButtonTag
可以将这些值存储在一个中。enum
您不能通过 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]);
}
}
(id)Sender 表明无论你传递 UIButton 点击事件是什么都直接传递给这个方法,不管它是什么类型,它会自动像你传递按钮标签然后它把按钮标签作为 sender.tag 等
正如其他人所提到的,您不能将自定义参数传递给操作方法。如果您不喜欢使用标签的解决方案,您也可以使用您的自定义类子类 UIButton 并在那里添加您的参数。(我不会打扰,只使用标签)
你没有。唯一的参数是 sender 对象,您可以使用它来获得不同的行为,但我要做的是定义 2 个操作方法,它们依次调用具有不同参数的相同方法,即您将拥有:
- (IBAction)button1:(id)sender
{
[self doStuff:kButton1];
}
- (IBAction)button2:(id)sender
{
[self doStuff:kButton2];
}
- (void)doStuff:(ParamType)param;
{
...
}
为了捍卫这种方法(没有双关语的意思),我要补充一点,当您使用 Interface Builder 查看您的 UI 以查看不同的按钮实际上具有不同的效果时,它会更清楚,这很难判断它们是否都调用了whateverAction: