Передача различных параметров в IBAction
В моем приложении iPhone есть много кнопок, и я хочу, чтобы все кнопки вызывали один и тот же метод, но с разными параметрами.
Например, я хочу нажать одну кнопку, чтобы вызвать метод myMethod:
с аргументом @"foo"
, а вторая кнопка должна вызвать тот же метод, но с аргументом @"bar"
.
Ответы
Ответ 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)¶ms;
... 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