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.
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
Buena captura. Editaré mi respuesta para no afirmar que el delegado de la ventana funcionará. –