14

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

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

4

7 回答 7

29

所谓的“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";
   ...
}
于 2010-01-22T12:27:53.193 回答
2

您无法添加其他参数的真正原因是 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)&params;

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

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

于 2012-01-14T11:24:15.200 回答
1

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

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

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

如果您想让它易于维护firstButtonTagsecondButtonTag可以将这些值存储在一个中。enum

于 2010-01-22T12:27:43.893 回答
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]);
    }
}
于 2010-01-22T12:27:58.063 回答
1

(id)Sender 表明无论你传递 UIButton 点击​​事件是什么都直接传递给这个方法,不管它是什么类型,它会自动像你传递按钮标签然后它把按钮标签作为 sender.tag 等

于 2012-03-27T11:38:25.750 回答
0

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

于 2010-01-22T12:33:24.473 回答
-1

你没有。唯一的参数是 sender 对象,您可以使用它来获得不同的行为,但我要做的是定义 2 个操作方法,它们依次调用具有不同参数的相同方法,即您将拥有:

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

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

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

为了捍卫这种方法(没有双关语的意思),我要补充一点,当您使用 Interface Builder 查看您的 UI 以查看不同的按钮实际上具有不同的效果时,它会更清楚,这很难判断它们是否都调用了whateverAction:

于 2010-01-22T12:28:53.443 回答