2010-06-12 3 views
3

Есть ли проблемы при использовании IBAction, когда он фактически не вызван действием пользователя?Использование метода IBAction, когда он не вызывается из действия?

Если у вас есть такое действие, как

-(IBAction)sayHello:(id)sender; 

Вы можете назвать это из вашего класса, как:

[self sayHello:@"x"] 

Символ @ «х» ничего не делает, он просто заполняет для Отправитель.

Вы действительно можете создать метод IBAction без (ID) отправителя

-(IBAction)sayHello; 

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

Просто пытаясь понять это.

ответ

6

Я считаю, что хорошей практикой для ООП является рефрактор метода - (IBAction) sayHello: (id) отправитель;

к другому методу, называемому: - (void) sayHello; и внутри метода - (IBAction) sayHello: (id) отправитель { [self sayHello]; }

Если другие методы хотят вызвать действие отправителя sayHello: (id), чтобы выполнить какую-либо работу, он может вызвать sayHello. Имя метода должно иметь смысл для клиента называть его без проблем или работать. Это поможет вам, когда вам придется тестировать или отлаживать

3

Отправитель должен быть компонентом пользовательского интерфейса. Так что если в вашем классе у вас есть, скажем, UIButton ...

UIButton *button; 

Тогда вы можете просто отправить его в качестве параметра к действию:

[self sayHello:button]; 

Insider метод, независимо от того, если вызывается из пользовательского интерфейса или каким-то образом смоделированным способом, вы можете иметь некоторую логику, чтобы определить, кто отправитель, и вести себя по-другому на основе этого. Таким образом, несколько кнопок или другие компоненты могут повторно использовать один и тот же метод действий.

+0

спасибо. очевидно, вам нужно назначить/init перед настройкой любых свойств (например, тега). использование контроля UIControl * немного более эффективно в тестах скорости. Это очень мало практического значения. – cannyboy

2

Если вы на самом деле не используете параметр sender (см. Ответ Jaanus для получения более подробной информации об этом), вам все равно, передав nil для этого при вызове метода из кода.

Смежные вопросы