2009-05-07 21 views
7

Me gustaría enviar una acción a otro objeto usando cocoa. Idealmente, también me gustaría que aparezca en el constructor Interfaz.Send An Action Cocoa - IBAction

He intentado con la documentación de la manzana, pero me falta algo. Agregando lo siguiente, la construcción de la interfaz solo muestra la acción como una recibida.

- (IBAction)setTarget:(id)anObject; 
- (IBAction)setAction:(SEL)aSelector; 

alguien podría darme un ejemplo de cómo crear una acción enviada. Gracias


Tengo la acción de recepción definida en mi controlador1. Luego quiero que mi controlador2 pueda enviar una acción al controlador1 (como lo hace NSButton). En la construcción de la interfaz puede arrastrar una línea DESDE NSButton al control que debería recibir la señal. Esta funcionalidad no puede limitarse solo a los objetos de manzana que existen, debe ser una forma de hacerlo.

Respuesta

1

controller1 y controller2 son una subclase de NSControl.

[controller2 sendAction:@selector(receiveAction:) to:controller1]; 
0

Las acciones siempre son recibidas por un objeto. Si desea enviar información en otra dirección, probablemente desee una salida: busque IBOutlet.

+0

¿Cómo funcionan los botones, p. NSSegmentedcontrol enviar alternar: ¿entonces? –

+0

NSSegmentedControl solo puede enviar 'toggle:' a un objeto que acepte ese mensaje. aroneous is correct: las acciones son declaradas por el receptor, no por el emisor. –

+0

Sí, tengo la acción de recepción definida en mi controlador1. Luego quiero que mi controlador2 pueda enviar una acción al controlador1 (como lo hace NSButton). En la construcción de la interfaz puede arrastrar una línea DESDE NSButton al control que debería recibir la señal. Esta funcionalidad no puede limitarse solo a los objetos de manzana que existen, debe ser una forma de hacerlo. –

1

NSButton es un NSControl, y por lo tanto tiene una "acción" que puede cablear: un mensaje que se envía cuando activa el control (por ejemplo, al hacer clic en un botón). Un controlador no tiene una acción (¿qué significaría, cómo haría que se envíe el mensaje?), Por lo que lo que está tratando de hacer no tiene sentido.

Si desea que el controlador2 pueda hacer que el controlador1 haga algo, debe crear una salida en el controlador2 (del tipo controlador1, o alguna interfaz que implemente), conéctelo al controlador1 en IB, y luego puede enviar cualquier mensaje usted quiere de controller2 a controller1 programáticamente.

1

Debería poder hacer esto si su clase Controller2 es una subclase de NSControl. NSControl define una "acción enviada" que es lo que está conectando con su objeto objetivo al arrastrar desde NSButton en el Generador de interfaces. Dicho esto, hay (¿hubo?) Un error en IB 3.0 que impidió que la acción enviada apareciera en IB. Vea this cocoa-dev thread para más detalles.

17

IBAction es una directiva de preprocesador que le dice a Interface Builder "esto es algo que debe conocer." En realidad evalúa a void. Lo que esto significa es que las "acciones" son métodos simplemente normales que se pueden llamar de la manera habitual:

[target someMethod:self]; 

Si quiere imitar el comportamiento que puede obtener de una NSButton, se puede añadir una salida para el objetivo y una propiedad para el selector (como una cadena):

@property (nonatomic, retain) IBOutlet id target; 
@property (nonatomic, retain) NSString* actionSelectorString; 

que luego se podría llamar así:

SEL action = NSSelectorFromString(self.actionSelectorString); 
[self.target performSelector:action withObject:self]; 

si desea que su clase para cablear el selector a través Arrastrar y soltar en el Creador de interfaz, la manera más fácil es hacer que su clase sea una subclase de NSControl (arrastre una vista personalizada desde la biblioteca de objetos, Comando-6 para mostrar el inspector, elija su clase en la ventana emergente superior).A continuación, puede "llamar" la acción al:

- (void) go { 
    [self sendAction:self.action to:self.target]; 
} 
+1

Interface Builder es el último pueblo de Potemkin. O tal vez más como ... Una esposa de stepford. Intenta con todas sus fuerzas no dejarte ver lo que sucede allí ... Entonces recuerdas que es una ciudad incendiada llena de aterradores parches de monos C, etc. –

+3

Hablada como alguien que nunca usó ninguno de los otros drag-y - herramientas de construcción de interfaz de gota, que tienden a ocultar mucho más y generar una tonelada de código que no se supone que debe tocar. IB trabaja con el tiempo de ejecución dinámico de ObjC para hacer cosas útiles pero no mágicas; la mitad de lo que hace se explica más arriba (la otra mitad es establecer propiedades), y eso no llevó mucho tiempo, ¿o sí? – TALlama

+1

Estoy siendo tonto ... y tienes razón ... incluso el ensamblaje generado por Xcode es bastante legible y elegante. ('Producto -> Generar salida -> Archivo de ensamblaje'). Sin embargo, Apple _dice_ baila una línea divertida/incómoda entre negar/fingir ignorancia de la existencia de algo anacrónico o poco técnico, al menos externamente. Solo documentan a la ligera las características de tiempo de ejecución que no desean que conozcas, etc. Todo es razonable e inofensivo ... pero dificulta y discute poco sobre la diversión, especialmente porque parte de ella está intencionalmente prohibida. –