2009-07-17 12 views
5

Estoy aprendiendo cómo crear programas con Cocoa. Estoy usando una aplicación de muestra de Apple que graba video desde una cámara web. Me gustaría comenzar y detener el video capturando la tecla presionar. Intenté anular el evento de selección, pero he leído que no es posible en un NSObject. ¿Cómo puedo manejar este tipo de evento?KeyDown y Cocoa Sample

La clase de aplicación extiende una clase NSObject.

Este es el código:

- (void)keyDown:(NSEvent *)event { 
    NSLog(@"Hi there"); 
    NSString *characters = [event characters]; 
    if ([characters length]) { 
    switch ([characters characterAtIndex:0]) { 
     case NSUpArrowFunctionKey: 
     NSLog(@"Key UP"); 
     break; 
    } 
    } 
} 

Respuesta

7

He tratado de anular evento Keydown pero he leído que no es posible en un NSObject.

Correcto. Solo un respondedor puede responder a los eventos.

¿Cómo puedo manejar este tipo de evento?

Implementar una respuesta. Subclassing NSWindow o NSWindowController funcionarán. Asegúrese de hacer que su ventana o controlador de ventana real sea una instancia de su subclase.

La documentación de Cocoa se explica con más detalle.

La clase de aplicación extiende una clase NSObject.

¿Por qué? Normalmente, la clase principal del paquete de aplicaciones es NSApplication o una subclase de eso, y no hay muchas buenas razones para subclasificar NSApplication.

PD: ¿Qué es un libro muy bueno para comenzar a aprender la Programación de MacOS?

No aprendí por el libro de Hillegass, yo mismo (me quedé con los documentos de Apple), pero es una recomendación muy popular y lo he leído y puedo decir que es bueno.

+1

Tenga cuidado de que el controlador de ventana, si está presente, sea el último respondedor para mensajes de eventos. Los delegados solo reciben mensajes de acción, no mensajes de eventos. – IlDan

+0

Buena captura. Editaré mi respuesta para no afirmar que el delegado de la ventana funcionará. –

4

Desde el Cocoa Event-Handling Guide - The Responder Chain:

La cadena de respuesta es una serie vinculada de los objetos de respuesta a la que se aplica un mensaje de evento o acción. Cuando un objeto respondedor dado no maneja un mensaje particular, el objeto pasa el mensaje a su sucesor en la cadena (es decir, su siguiente respondedor).

Cuando presiona una tecla, la ventana recibe el evento keyDown. A continuación, distribuye el evento al primera respuesta, que generalmente es el control con un bisel azul alrededor de su borde (intente hacer clic en el campo de dirección en Safari o Firefox, cuando está enloquecido y tiene el estado de primera respuesta) .

Si el primer nivel de respuesta no comer la pulsación de tecla (el campo de dirección Safari hace comerlo cuando muestra un carácter), entonces se pasa hacia abajo de la cadena de respondedor a la siguiente respondedor en la jerarquía de vistas, luego a la ventana y al controlador de la ventana como puede ver en el Guide.(Tenga cuidado de que el respondedor de acción sea otra historia)

Así que debe implementar KeyDown: en una vista de su ventana o en la misma ventana, si no tiene vistas que consuman eventos. La forma más sencilla de probar es anular el método keyDown: de una ventana vacía

Para poner sus manos en el funcionamiento interno, puede incluso intentar anular el método sendEvent: de una ventana. sendEvent: distribuye los eventos a las vistas de la ventana, y desde allí puede, por ejemplo, registrar todos los eventos gestionados por la ventana.

4

Subclase NSWindow o NSWindowController funcionará.

Del mismo modo, puede subclase NSView y anular sus métodos de gestión de eventos.

¿Qué es un libro muy bueno para empezar a aprender MacOS Programming?

Learn Objective-C on the Mac de Dalrymple es muy sencillo, cubre bastantes elementos básicos y se mueve lo suficientemente rápido como para despegar del suelo en poco tiempo. Toca todo, desde Xcode e Interface Builder hasta las prácticas OOP y Objective-C. Particularmente útil para los principiantes (en mi humilde opinión) son la organización de archivos fuente y los capítulos del kit de la Fundación.

¡La mejor de las suertes!

+0

"Asegúrese de que su ventana o controlador de ventana real sea una instancia de su subclase". Otra gracias a Peter. Esto ayudó en otro hilo: http://stackoverflow.com/questions/1854112/keyup-event-heard-overridden-nsview-method –