objective-c ibaction sender

objective c - Objetivo C: ¿qué es un "remitente(id)"?



objective-c ibaction (6)

En algunos IBAction vi:

- (IBAction)pushButton:(id)sender;

Este (id)sender cuándo lo uso?


"remitente" es el nombre de la variable.

"(id)" significa que el tipo de la variable es "id", que se encuentra en "cualquier objeto" (Puede verlo como la parte superior de la jerarquía de objetos si lo desea

El nombre del método es pushButton: y requiere 1 parámetro de cualquier tipo.

Este método estará vinculado a un botón en la interfaz de usuario. El delegado de esta interfaz de usuario recibirá esta llamada y tendrá una referencia al UIButton que realizó la llamada. A veces no lo necesita, a veces necesita tener acceso a ese UIButton para cambiar sus propiedades, por ejemplo.


Aprendí de Rabskatran. Pero me gustaría corregir la única parte que dice "remitente" es el nombre de la variable. Debería ser (a partir de la documentación de Apple - https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/EventOverview/EventArchitecture/EventArchitecture.html ):

"Los métodos invocados por los mensajes de acción tienen una firma específica: un único parámetro que contiene una referencia al objeto que inicia el mensaje de acción; por convención, el nombre de este parámetro es remitente. Por ejemplo,

  • (void) moveToEndOfLine: (id) remitente; // desde NSResponder.h "

¡ASÍ ES UN PARÁMETRO!



Es parte del mecanismo de acción objetivo de Cocoa, que es una forma en que los objetos se pueden comunicar entre sí. En respuesta a un evento (como un clic del mouse), un objeto (generalmente un control de algún tipo) envía un mensaje a otro objeto. El emisor se llama, bueno, "emisor", el receptor es el "objetivo" y el mensaje es la "acción".

Puede usarlo en el controlador de mensajes del objetivo para obtener información adicional sobre la acción del remitente.


Matt Galloway describió el significado de (id) sender en acciones en los foros de iPhone Dev SDK por lo tanto:

(id) remitente es el objeto que envió el mensaje a ese selector. Es como en las funciones delegadas donde tiene el control pasado a la función, etc.

Utilizaría esto si tuviera 2 objetos que estuvieran llamando a ese selector y quisiera distinguirlos. Por supuesto, puedes usar dos funciones diferentes, pero a menudo es más limpio y con menos duplicación de código para usar una función.

Consulte la referencia de clase de UIControl para obtener más detalles.

Un ejemplo para eso, UITextField tiene un delegado que se dispara cuando finaliza la edición de 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]; } }


(id)sender is the object which sent the message to that selector.

Ejemplo de código:

- (IBAction)submitButton:(id)sender { UIButton *button = (UIButton *)sender; [button setEnabled:NO]; [button setTitle:@"foo" forState:UIControlStateDisabled]; }