Как лучше всего вызвать IBAction из кода?

Скажем, например, у меня есть IBAction, который подключен к UIButton в построителе интерфейса.

- (IBAction)functionToBeCalled:(id)sender
{
   // do something here   

}

В моем коде, скажем, в другом методе, как лучше всего вызвать этот IBAction?

Если я попытаюсь вызвать его так, я получаю сообщение об ошибке:

[self functionToBeCalled:];

Но если я попытаюсь назвать это так (я думаю, немного обманываю), он отлично работает:

[self functionToBeCalled:0];

Как правильно это назвать?


person iwasrobbed    schedule 22.05.2010    source источник


Ответы (2)


Правильный способ:

- [self functionToBeCalled:nil] 

Для передачи отправителя nil, указывающего, что он не был вызван через обычную структуру.

ИЛИ

- [self functionToBeCalled:self]

Выдать себя за отправителя, что тоже правильно.

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

person Jakob Borg    schedule 22.05.2010
comment
Как насчет передачи [тега отправителя] программно? - person Andy Davies; 08.06.2012
comment
@Andy, вы можете передать любой подкласс NSView этим методам. Ну, на самом деле, вы можете передать любой NSObject! (id) Является универсальным типом, который может содержать любой параметр. Просто убедитесь, что вы отправили то, что IBAction ожидает получить (обычно это подкласс NSView). - person Georges Oates Larsen; 19.06.2012
comment
@ZaidPathan, который работает, только если ваш метод IBAction объявлен без аргумента отправителя - person chiliNUT; 06.05.2016
comment
Это работает, но это плохая практика программирования, вызывающая IBActions напрямую, потому что эти функции предназначены для вызова из кода пользовательского интерфейса. Лучше создать новую функцию и вызывать ее из обоих мест. Таким образом, мы не будем добавлять зависимость к коду, связанному с пользовательским интерфейсом. - person xpereta; 24.06.2018

Семантически говоря, вызов IBAction должен вызываться только событиями пользовательского интерфейса (например, нажатием кнопки). Если вам нужно запустить один и тот же код из нескольких мест, вы можете извлечь этот код из IBAction в специальный метод и вызвать этот метод из обоих мест:

- (IBAction)onButtonTap:(id)sender {
    [self doSomething];
}

Это позволяет вам выполнять дополнительную логику в зависимости от отправителя (возможно, вы можете назначить одно и то же действие нескольким кнопкам и решить, что делать, на основе параметра sender). А также уменьшает количество кода, который вам нужно написать в IBAction (что поддерживает чистоту реализации вашего контроллера).

person Cristik    schedule 01.10.2015