Передать различные параметры в IBAction - PullRequest
13 голосов
/ 22 января 2010

В моем приложении для iPhone много кнопок, и я хочу, чтобы все кнопки вызывали один и тот же метод, но с разными параметрами.

Например, я хочу нажать одну кнопку, чтобы вызвать метод myMethod: с аргументом @"foo", а вторая кнопка должна вызвать тот же метод, но с аргументом @"bar".

Ответы [ 7 ]

28 голосов
/ 22 января 2010

Так называемые «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";
   ...
}
2 голосов
/ 14 января 2012

реальная причина Вы не можете добавить дополнительный параметр, потому что UIKIT будет помещать параметры в стек. поэтому единственный способ - использовать теги. Грязным способом можно преобразовать указатель в 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 (все более и более уродливый код ...). НЕ используйте локальную переменную: она будет размещена в стеке, поэтому будет удалена после выхода из метода установки.

1 голос
/ 27 марта 2012

(id) Отправитель показывает, что независимо от того, передаете ли вы событие щелчка UIButton, оно напрямую передается этому методу, и независимо от того, какого типа оно будет, оно будет восприниматься автоматически, как если бы вы передали тег кнопки, то он принимает тег кнопки как sender.tag. и т.д.

1 голос
/ 22 января 2010

Невозможно передать параметры через 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]);
    }
}
1 голос
/ 22 января 2010

Дайте вашим различным UIButton экземплярам различные tag значения свойств.

В вашем IBAction методе -myMethod: вы можете сделать что-то вроде:

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

Значения firstButtonTag и secondButtonTag могут быть сохранены в enum, если вы хотите облегчить обслуживание.

0 голосов
/ 22 января 2010

Как уже упоминали другие, вы не можете передать свой пользовательский параметр в метод действия. Если вам не нравится решение с использованием тегов, вы можете также создать подкласс UIButton с вашим пользовательским классом и добавить туда свой параметр. (Я бы не стал беспокоиться и просто использовать теги)

0 голосов
/ 22 января 2010

Ты не. Единственным параметром является объект-отправитель, который вы можете использовать, чтобы иметь другое поведение, но я бы определил 2 метода действия, которые, в свою очередь, просто вызывают один и тот же метод с другим параметром, т.е. вы должны иметь:

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

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

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

В защиту этого метода (без каламбура) я бы добавил, что когда вы просматриваете свой пользовательский интерфейс в Интерфейсном Разработчике, становится понятнее, что разные кнопки на самом деле имеют разные эффекты, что сложнее сказать, если все они вызывают whatAction. :

...