2011-04-07 16 views
33

En algunos IBAction vi:Objetivo C: ¿qué es un "remitente (id)"?

- (IBAction)pushButton:(id)sender; 

Este (id)sender cuando lo uso?

+3

Nota Puede [líneas de formato como el código] (http://meta.stackexchange.com/questions/22186/how-do-i- format-my-code-blocks) al sangrarles cuatro espacios. Una '-' inicial, por el contrario, te da un elemento de lista, como puedes ver en tu que stion. El botón "{}" en la barra de herramientas del editor hace esto por usted. Edita tu pregunta y pruébala. Haga clic en el signo de interrogación naranja en la barra de herramientas del editor para obtener más información y sugerencias sobre el formateo. – outis

Respuesta

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

ejemplo Código:

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

bien, pero puede usar este identificador de identificación solo para el "botón"; si debería modificar un campo de texto, ¿cuál es el camino? – CrazyDev

+0

@blackguardian: ¿quiere decir que quiere convertir el identificador a un UITextField y luego cambiar su texto? –

+0

sí ............ – CrazyDev

62

Matt Galloway describe el significado de (id) sender en acciones en los foros de iPhone Dev SDK de esta manera:

(id) emisor es el objetivo que envió el mensaje a ese selector. Es como en las funciones de delegado donde tiene el control transferido a la función, etc.

Utilizaría esto si tuviera 2 objetos que estaban llamando a ese selector y deseaba 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.

Ver el UIControl Class Reference para más detalles.


Un ejemplo de ello, UITextField tiene un delegado, que se activa cuando termina 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]; 
    } 
} 
+13

Esta respuesta es en realidad mejor que la respuesta que se ha aceptado ... –

4

"emisor" es el nombre de la variable.

"(id)" significa que el tipo de la variable es "id", que se encuentra de "cualquier objeto" (Se puede ver como la parte superior de la jerarquía de objetos si desea

El nombre de el método es pulsador:. y requiere 1 de parámetros de cualquier tipo

este método estará vinculada a un botón en la interfaz de usuario el delegado de esta interfaz de usuario recibirá esta llamada y tendrá una referencia a la UIButton que tiene. hizo la llamada. A veces no la necesita, a veces necesita tener acceso a ese UIButton para cambiar sus propiedades, por ejemplo.

1

Es parte del target-action mechanism de Cocoa, que es una de las formas 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 destino para obtener información adicional sobre la acción del remitente.

+0

Esto sería más útil si hubiera un ejemplo de cómo obtener exactamente la información adicional :) –

+0

@GForty: no es posible, ya que 'id' es un objeto genérico. En general, es un objeto NSO, pero el tipo no es más cierto que eso. Si desea información adicional, debe saber qué interfaces implementa el objeto y enviarle los mensajes apropiados (como en la muestra de gontnull, donde se supone que el remitente es un botón). – outis

0

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

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

SO Es un parámetro!

0

He aquí un ejemplo de los emisores (id) que pasa información de la etiqueta de varios botones para una IBAction. Este video demuestra el concepto de (id) remitente en la acción, lo que me pareció ser muy útil.

iPhone Programming - (id)sender explained

Cuestiones relacionadas