Цель C: что такое «(id) отправитель»? - PullRequest
36 голосов
/ 07 апреля 2011

В некоторых IBAction я видел:

- (IBAction)pushButton:(id)sender;

Это (id)sender когда мне его использовать?

Ответы [ 6 ]

62 голосов
/ 07 апреля 2011

Мэтт Галлоуэй описал значение (id) sender в действиях на форумах iPhone Dev SDK следующим образом:

(id) отправитель - это объект, который отправил сообщение этому селектору. Это как в функциях делегатов, где управление передается функции и т. Д.

Вы бы использовали это, если бы у вас было 2 объекта, которые вызывали этот селектор, и вы хотели бы различать их. Конечно, вы можете просто использовать две разные функции, но зачастую использование одной функции чище и требует меньше дублирования.

см. UIControl Class Reference для получения более подробной информации.

<Ч />

Примером этого является то, что UITextField имеет делегата, который срабатывает, когда заканчивается редактирование UITextField:

-(IBAction) editingEnded:(id) sender {
   // the cast goes here, lets assume there's more than one UITextfield 
   // in this Owner and you want to know which one of them has triggered
   // the "editingEnded" delegate
   UITextField *textField= (UITextField*)sender;
   if(textfield == iAmTheLastTextField)
   {
     // for example login now.
     [self login];
   }
}
36 голосов
/ 07 апреля 2011
(id)sender is the object which sent the message to that selector.

Пример кода:

- (IBAction)submitButton:(id)sender {
    UIButton *button = (UIButton *)sender;
    [button setEnabled:NO];
    [button setTitle:@"foo" forState:UIControlStateDisabled];
}
5 голосов
/ 07 апреля 2011

«sender» - это имя переменной.

«(id)» означает, что типом переменной является «id», что означает «любой объект» (Вы можете увидеть его какверхняя часть иерархии объектов, если вы хотите

Имя метода: pushButton: и требует 1 параметр любого типа.

Этот метод будет связан с кнопкойна UI. Делегат этого UI получит этот вызов и будет иметь ссылку на UIButton, который сделал вызов. Иногда вам это не нужно, иногда вам нужен доступ к этому UIButton, чтобы, например, изменить его свойства.

1 голос
/ 07 апреля 2011

Это часть механизма целевого действия Какао, который является одним из способов взаимодействия объектов друг с другом. В ответ на событие (например, щелчок мышью) один объект (обычно какой-то элемент управления) отправляет сообщение другому объекту. Отправитель называется, ну, «отправитель», получатель - «цель», а сообщение - «действие».

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

0 голосов
/ 03 марта 2012

Вот пример (id) отправителя, передающего информацию тега от нескольких кнопок одному IBAction.Это видео демонстрирует концепцию (id) отправителя в действии, что мне показалось очень полезным.

Программирование на iPhone - (id) отправитель объяснил

0 голосов
/ 15 апреля 2011

Я учился у Рабскатрана. Но я хотел бы исправить единственную часть, в которой говорится, что «отправитель» - это имя переменной. Должно быть (из документации Apple - https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/EventOverview/EventArchitecture/EventArchitecture.html):

"Методы, вызываемые сообщениями действия, имеют особую сигнатуру: один параметр, содержащий ссылку на объект, инициирующий сообщение действия; условно, имя этого параметра - отправитель. Например,

  • (аннулируются) moveToEndOfLine: (идентификатор) отправителя; // из NSResponder.h "

ТАК ЭТО ПАРАМЕТР!

...