Есть ли преимущество наличия (id) отправителя в IBAction - PullRequest
0 голосов
/ 29 июня 2011

При кодировании с какао я заметил, что необязательно иметь параметр sender при определении IBAction, следовательно, следующее действие:

- (IBAction)showUserInfo:(id)sender;

может быть объявлено как

- (IBAction)showUserInfo;

Так что мне интересно, есть ли какое-либо другое преимущество, кроме наличия кнопки / пункта меню, отправляющего действие? Единственная другая ситуация, о которой я могу подумать, это иметь несколько объектов, вызывающих один и тот же IBAction. Что-нибудь еще?

Ответы [ 2 ]

2 голосов
/ 29 июня 2011

Документ говорит,

Параметр отправитель обычно идентифицирует элемент управления, отправляющий сообщение действия (хотя это может быть другой объект, замененный фактическим отправителем).Идея этого похожа на обратный адрес на открытке.Целевой объект может запросить отправителя для получения дополнительной информации, если ему это необходимо.

Параметр sender помогает, если вам нужны какие-либо данные из него.Например, на UISegmentControl меняют значение, как в @Mark Adams answer.Поэтому, если вам не нужна информация от отправителя, вы можете просто пропустить ее, как в вашем примере - (IBAction)showUserInfo;.

1 голос
/ 29 июня 2011

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

Например, если я подключил метод к UISegmentedControl и установил для его события управления значение UIControlEventValueChanged, я могу использовать объект, переданный в качестве аргумента sender:, для получения индекса выбранного сегмента, а затем, назначение, внесите изменения в пользовательский интерфейс.

-(IBAction)segmentedControlValueChanged:(id)sender
{
    UISegmentedControl *control = (UISegmentedControl *)sender;

    // Show or hide views depending on the selected index of the segmented control.
    if (control.selectedSegmentIndex == 0)
        someView.hidden = YES;
    else 
        someView.hidden = NO;
}
...