Подтвердить что ты не робот

Передача различных параметров в IBAction

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

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

4b9b3361

Ответ 1

Так называемые "IBActions" должны иметь одну из этих подписей:

-(void)action;
-(void)actionWithSender:(id)sender;
-(void)actionWithSender:(id)sender event:(UIEvent*)event;

Вы не можете добавить никаких других параметров. Тем не менее вы можете использовать sender (который является кнопкой1 или кнопкой2 в вашем случае), чтобы получить параметр:

-(void)actionWithSender:(UIButton*)sender {
   NSString* parameter;
   if (sender.tag == 1)   // button1
     parameter = @"foo";
   else                   // button2
     parameter = @"bar";
   ...
}

Ответ 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;

ПРИМЕЧАНИЕ: params ДОЛЖНЫ сохранять статичность.. или выделять с помощью malloc (все больше и больше уродливого кода...). НЕ используйте локальный var: он будет выделен в стеке, поэтому он будет удален после выхода из метода установки.

Ответ 3

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

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

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

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

Ответ 4

Вы не можете передавать параметры через 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]);
    }
}

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

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

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

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