2010-05-16 15 views
5

No puedo encontrar esta respuesta en ningún lado. ¿Qué significa cuando hay un parámetro de remitente en un encabezado de método? ¿Representa la instancia que lo llamó o el método que lo llamó?¿Qué es el remitente?

Respuesta

3

No hay magia involucrada. Probablemente estés hablando de los métodos vinculados a algunos elementos de la interfaz de usuario por Interface Builder, ¿verdad?

- (IBAction) userDidPressButton: (id) sender {...} 

El IBAction es una macro que se expande hasta el vacío. Es simplemente un azúcar sintáctico que marca los métodos que desea que estén disponibles en Interface Builder. Ahora, al conectar este método hasta cierto elemento de la interfaz, por ejemplo un botón, IB llama al método addTarget ... en el botón:

[button addTarget:yourObject action:@selector(userDidPressButton:) forEvent:...]; 

Y cuando se pulsa el botón, se pasa a través de su lista de acciones e incendios el userDidPressButton, pasando a sí mismo como el primer argumento. Probablemente no sea tan útil para los botones, pero también puede usar el mismo mecanismo para obtener eventos de cambio desde un control deslizante, y en ese caso puede usar el argumento del remitente para obtener el valor del control deslizante.

+1

La segunda mitad de su respuesta cubre Cocoa Touch, pero es inexacto para cacao, donde cada control tiene un solo objetivo y acción a la vez. Las únicas excepciones son NSTableView y NSOutlineView, que todavía tienen solo un objetivo por instancia pero tienen dos selectores de acción por instancia (uno para clics, uno para clics dobles). –

+0

Sí, solo trabajo con Cocoa Touch, gracias por la aclaración. – zoul

4

¿Qué significa cuando hay un parámetro de remitente en un encabezado de método? ¿Representa la instancia que lo llamó o el método que lo llamó?

Mire el tipo de argumento. Es probable que sea id. Ese es el tipo de un puntero de objeto. Tiene razón en que es la instancia que envió el mensaje.

se puede pasar un selector mensaje a un mensaje, pero el tipo de esto es SEL, no id. Del mismo modo, puede pasar una implementación de método a un mensaje, pero el tipo para eso es IMP, no id.

Los métodos que toman un solo argumento sender son típicamente métodos de acción, generalmente identificados por el tipo de devolución IBAction. Como dijo Zoul, IBAction se expande a void para el compilador, lo que indica que el método no devuelve un valor. El motivo para tener IBAction es que Interface Builder busca métodos con IBAction como tipo de devolución y los detecta como acciones a las que puede conectar un control. Para obtener más información sobre Cocoa (Mac OS X), consulte “The Target-Action Mechanism” in the Cocoa Fundamentals Guide y Control and Cell Programming Topics for Cocoa.
Para obtener más información sobre Cocoa Touch (iPhone/iPod touch/iPad), consulte “The Target-Action Mechanism” in the UIControl class reference.

1

Por supuesto, hay muchas formas técnicas de describir esto, Pero en teoría 'no no', el argumento del remitente que pasa es solo el objeto GUI que lo pasa.

Así que si vincula este método a un botón específico, llamaremos a Button1, el remitente es Button1, y con él viene toda la información disponible para el botón. Tamaño, texto, etc.

Espero que esto haya sido suficiente.

Bryan

Cuestiones relacionadas