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


En algunos IBAction vi:

- (IBAction)pushButton:(id)sender;

Esto (id)sender ¿cuándo lo uso?

Author: Matthias Bauch, 2011-04-07

6 answers

(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];
}
 34
Author: fuzz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-19 23:14:02

Matt Galloway describió el significado de (id) sender en acciones en los foros de iPhone Dev SDK así:

(id)sender 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.

Usarías esto si tuvieras 2 objetos que estuvieran llamando a ese selector y quisieras distinguir entre ellos. Por supuesto, podría usar dos funciones diferentes, pero a menudo es más limpio y menos duplicación de código para usar una función.

Ver el Referencia de clase UIControl para más detalles.


Un ejemplo para eso, UITextField tiene un delegado que se activa 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];
   }
}
 62
Author: Ahmad Kayyali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-24 10:24:51

"sender" es el nombre de la variable.

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

El nombre del método es pulsador: 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 UI recibirá esta llamada y tendrá una referencia al UIButton que ha realizado la llamada. A veces no lo necesitas, a veces es necesario tener acceso a ese UIButton para cambiar sus propiedades, por ejemplo.

 4
Author: Pierre Watelet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-07 08:42:20

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

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

 1
Author: outis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-07 08:46:02

Aprendí de Rabskatran. Pero me gustaría corregir la única parte que dice "remitente" es el nombre de la variable. Debería ser (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 el remitente. Por ejemplo,

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

ASÍ QUE ES UN PARÁMETRO!

 0
Author: dung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-15 18:06:58

Aquí hay un ejemplo de remitente (id)que pasa información de etiquetas de varios botones a una IBAction. Este video muestra el concepto de remitente (id) en acción, que me pareció muy útil.

Programación de iPhone - (id)remitente explicado

 0
Author: theMouse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-03 01:36:10