Я предпочитаю использовать функции стрелок во все времена, когда не требуется доступ к локальному this
, потому что функция стрелки не связывает свои собственные, аргументы, супер или new.target .
Так называемые «Ibactions» должны иметь одну из этих подписей:
-(void)action;
-(void)actionWithSender:(id)sender;
-(void)actionWithSender:(id)sender event:(UIEvent*)event;
Вы не можете добавлять какие-либо другие параметры. Тем не менее, вы можете использовать отправителя
(который является Button1 или Button2 в вашем случае) для получения параметра:
-(void)actionWithSender:(UIButton*)sender {
NSString* parameter;
if (sender.tag == 1) // button1
parameter = @"foo";
else // button2
parameter = @"bar";
...
}
Вы не можете пропускать параметры через 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]);
}
}
Дайте различные UBUTTON
экземпляров различных TAG
Значения свойств.
В вашем методе
метод -Mymethod:
, вы можете сделать что-то вроде:
- (void) myMethod:(id)sender {
switch (sender.tag) {
case (firstButtonTag):
doFooStuff;
break;
case (secondButtonTag):
doBarStuff;
break;
// etc.
}
}
значения INFERBUTTONTAG
и WITHBUTTONTAG
Может храниться в enum
, если вы хотите сделать это легко для обслуживания.
Как упомянул другие, вы не можете пройти свой пользовательский параметр в метод действий. Если вам не нравится решение, используя теги, вы также можете подклассьте Uibutton с вашим пользовательским классом и добавить там свой параметр. (Потому что я бы не буду беспокоиться и просто использовать теги)
Вы не. Единственным параметром является объект отправителя, который вы можете использовать, чтобы иметь другое поведение, но то, что я бы сделал, это определить 2 метода действия, которые просто в свою очередь вызовут один и тот же метод с другим параметром, то есть у вас есть:
- (IBAction)button1:(id)sender
{
[self doStuff:kButton1];
}
- (IBAction)button2:(id)sender
{
[self doStuff:kButton2];
}
- (void)doStuff:(ParamType)param;
{
...
}
В защиту этого метода (без каламбула), я бы добавил, что он делает более понятнее, когда вы просматриваете свой интерфейс с помощью интерфейса, чтобы увидеть, что разные кнопки на самом деле имеют разные эффекты, которые труднее сказать, если они все звонят как что