Hice una aplicación cambiando al modo de pantalla completa. Quiero usar la tecla ESC para escapar del modo de pantalla completa, pero el elemento del menú de enlace a la tecla ESC en IB se elimina en el tiempo de ejecución. ¿Cómo puedo mantener la tecla ESC vinculante a un elemento del menú?¿Cómo puedo manejar la tecla ESC en la aplicación Cocoa?
Respuesta
Una forma de capturar los eventos del teclado consiste en subclases:
- Subclase su clase de pantalla completa (por ejemplo) NSView.
- Agregue el método
- (void) keyDown:(NSEvent *)theEvent
a la implementación de la subclase. - Abre InterfaceBuilder y selecciona la clase de pantalla completa que creaste anteriormente.
- Cambie su clase a su nueva subclase.
La subclase se ve algo como:
MySubclass.h
@interface MySubclass : NSView {
}
@end
MySubclass.m
@implementation MySubclass
- (void)keyDown:(NSEvent *)theEvent
{
switch([theEvent keyCode]) {
case 53: // esc
NSLog(@"ESC");
// Call the full-screen mode method
break;
default:
[super keyDown:theEvent];
}
}
@end
Esto no se une la tecla ESC
al elemento de menú, pero le da una funcionalidad equivalente (y un poco más flexibilidad ya que puede interceptar todos los eventos del teclado).
La forma preferida de manejar la clave de escape en Cocoa es como @Josh Caswell said.
#pragma mark - NSResponder
- (void)cancelOperation:(id)sender
{
[self exitFullScreen];
}
Esta debería ser la respuesta aceptada. –
Lo segundo también. –
que necesitaba para esquivar WKWebView se bloquea cuando se pulsa ESC así que subclase, y añadió (?):
import Carbon.HIToolbox
override func keyDown(with event: NSEvent) {
if event.keyCode == UInt16(kVK_Escape) {
// We crash otherwise, so just close window
self.window?.performClose(event)
}
else
{
// still here?
super.keyDown(with: event)
}
}
Muchas personas tratan de implementar la funcionalidad clave esc. Hay cancelOperation en la cadena de respuesta para manejar eventos de escape.
//WRONG
- (void)keyDown:(NSEvent *)event
{
//unichar character = 0;
//if ([event type] == NSEventTypeKeyDown) {
// if ([[event charactersIgnoringModifiers] length] == 1) {
// character = [[event characters] characterAtIndex:0];
// }
//}
switch (character) {
//THIS IS WRONG correct is to implement interpretKeyEvents+moveRight
//case NSRightArrowFunctionKey:
// [self moveSelectedIndexRight];
// break;
//THIS IS WRONG correct is to implement interpretKeyEvents+ moveLeft
//case NSLeftArrowFunctionKey:
// [self moveSelectedIndexLeft];
// break;
//THIS IS WRONG correct is to implement interpretKeyEvents+ moveLeft
//case NSCarriageReturnCharacter:
// [self dismissWithCurrentlySelectedToken];
// break;
default:
[self interpretKeyEvents:@[event]];
[super keyDown:event]
break;
}
}
//CORRECT
- (void)keyDown:(NSEvent *)event
{
[self interpretKeyEvents:@[event]];
[super keyDown:event];
}
`/* Catch the commands interpreted by interpretKeyEvents:. Normally, if we don't implement (or any other view in the hierarchy implements) the selector, the system beeps. Menu navigation generally doesn't beep, so stop doCommandBySelector: from calling up t`he hierarchy just to stop the beep.
*/
- (void)doCommandBySelector:(SEL)selector {
if ( selector == @selector(moveRight:)
|| selector == @selector(moveLeft:)
|| selector == @selector(cancelOperation:)
|| selector == @selector(insertNewline:))
{
[super doCommandBySelector:selector];
}
// do nothing, let the menu handle it (see call to super in -keyDown:)
// But don't call super to prevent the system beep
}
- (void)cancelOperation:(id)sender
{
//do your escape stuff
}
- (void)insertNewline:(id)sender
{
//do your enter stuff
}
- (void)moveRight:(nullable id)sender
{
[self moveSelectedIndexRight];
}
- (void)moveLeft:(nullable id)sender
{
[self moveSelectedIndexLeft];
}
- 1. Cómo manejar la tecla ESC en la ventana emergente de Javascript
- 2. Ejecutar onclick de la tecla ESC
- 3. Teclas Esc e Intro en el cuadro de diálogo Cocoa
- 4. ¿Cómo puedo manejar la tecla Retorno en un control CEdit?
- 5. Tecla Esc del mapa en Vim
- 6. Cómo puedo obtener el menú de la aplicación en Cocoa
- 7. ¿Cómo cerrar solo un cuadro de diálogo en la tecla ESC en WPF/WinForms?
- 8. ¿Cómo incluir OpenCV en la aplicación Cocoa?
- 9. Cómo finalizar la edición en el interior NSTextFieldCell NSOutlineView después de pulsar la tecla ESC
- 10. JQuery Esc Presión de tecla presionar
- 11. Cómo manejar evento de pulsación de tecla aplicación de consola
- 12. ¿Cómo cedo el enfoque a la aplicación anterior en Cocoa?
- 13. ¿Cómo se obtiene la tecla ESC para cerrar un cuadro de diálogo en Winforms?
- 14. ¿Cómo preservar guión después de pulsar la tecla Esc en Vim
- 15. ¿Cómo ocultar un div con la tecla esc y hacer clic? En Jquery
- 16. Manejar la tecla Enter en EditText en diferentes dispositivos
- 17. ¿Cómo sobrescribo el comportamiento presionado de la tecla ESC para el diálogo de jQuery?
- 18. ¿Cómo se manejan los eventos de pulsación de tecla en una aplicación de la consola Qt?
- 19. Cómo incorporar WebSockets en una aplicación Cocoa
- 20. ¿Hace que mi aplicación Cocoa responda a la tecla de reproducción/pausa del teclado?
- 21. fork dentro de la aplicación Cocoa
- 22. ¿Cómo puedo decirle a mi aplicación Cocoa que cierre desde la propia aplicación?
- 23. ¿Cómo se maneja la clave "Esc" en la ventana de WPF?
- 24. Dónde colocar la "pila de datos del núcleo" en una aplicación Cocoa/Cocoa Touch
- 25. Ejecutar AppleScript desde la aplicación Cocoa
- 26. Recibir notificaciones cuando la aplicación actual cambie en Cocoa
- 27. La aplicación no acepta la pulsación de tecla
- 28. ¿Cómo manejar las URL de la aplicación en un UIWebView?
- 29. Cómo manejar la ActivityNotFoundException?
- 30. Arquitectura de la aplicación Cocoa en Mac OS X
Otra opción es implementar 'cancelOperation:', que también responde a ⌘-. –
he subclasificado la clase nswindow y todavía no puedo capturar la clave esc, cuando se está editando un nstextfield ... –
La constante '53' está disponible como' kVK_Escape' si (en Objective-C) 'importan carbono; 'o' #import '. En Swift, 'importa Carbon.HIToolbox'. –