Хорошо, сначала .... IBAction
не означает ничего особенного, кроме Интерфейсного Разработчика. В основном:
#define IBAction void
Поэтому всякий раз, когда вы видите IBAction
, думайте «пустота». Единственная причина, по которой он существует, заключается в наличии флага, сообщающего Интерфейсному Разработчику, что метод является допустимым методом для подключения управляющих действий. Компилятору Objective-C не нужно знать об этом, поэтому он определен как void, поскольку все методы «action» возвращают void.
Во-вторых, методы действия также имеют один аргумент, который может быть объектом любого числа типов. Из-за этого методы действия должны использовать тип id
в качестве типа своего аргумента. Таким образом, им можно передать указатель на любой объект Objective-C, не вызывая при этом компилятор сгенерировать ошибку проверки типа.
Так что обычно действия должны работать примерно так:
- (IBAction)myAction:(id)sender {
if (sender == self.someButton) {
UIButton *button = (UIButton *)sender;
...
return;
} else if (sender == self.someControl) {
UIControl *control = (UIControl *)sender;
...
return;
}
}
Другими словами, id
почти подобен нетипизированному указателю, как void *
обычно используется в C, когда какой-то функции требуется взять указатель на что-то неизвестного типа. sender
может быть различными типами управления, поэтому используется нечто общее, например id
, тогда отправитель приводится к чему-то более конкретному, когда код знает, что это такое.
В любом случае, нет абсолютно никакой причины определять что-либо как возвращаемый тип IBAction
, если только вы не собираетесь использовать этот метод в качестве целевого действия в Интерфейсном Разработчике. Наличие делегата IBAction в вашем приложении кажется необычным ...