macos - teclado - ¿Cómo puedo detectar que la tecla Shift ha sido presionada?
tecla shift no funciona (5)
Aquí está el código que trata el evento clave con swift 3.0.1 probado en Xcode 8.2.1 y macOS 10.12.2
override func keyDown(with event: NSEvent) {
var handled = false
if event.keyCode == 53 { // ESC, same as `CMD + .`
handled = true
print("ESC")
}
if event.modifierFlags.contains(.command) { // .shift, .option, .control ...
if let chars = event.charactersIgnoringModifiers {
handled = true // likely we are interested with that key
switch chars {
case "r":
print("CMD + r")
case ",":
print("CMD + ,")
case "/":
print("CMD + /")
default:
handled = false
}
}
}
if !handled {
super.keyDown(with: event) // let system handle it(may contains sound)
}
}
Tengo una subclase NSView
y me gustaría que reaccionara cuando el usuario presiona la tecla Shift . Sin embargo, -[NSView keyDown:]
(que -[NSView keyDown:]
actualmente) no se llama cuando se presionan solo las teclas modificadoras.
¿Cómo puedo recibir una notificación cuando se presiona la tecla Shift?
Aquí hay un ejemplo, modificado ligeramente de la aplicación de ejemplo ModKeyTest de Matt Gemmell. Cree una aplicación básica de Cocoa con un botón y conecte el botón a una IBAction como esta. Luego prueba la combinación de teclas que desees. Los documentos son un poco confusos, pero el ejemplo de Matt es muy claro y presenta todo lo que necesita para aprovechar esto más lejos de los documentos.
- (IBAction)myAction:(id)sender {
NSUInteger flags = [[NSApp currentEvent] modifierFlags];
if ((flags & NSCommandKeyMask) && (flags & NSAlternateKeyMask) && (flags & NSControlKeyMask)) {
NSBeginInformationalAlertSheet(@"Modifier keys Command Option Control detected", nil, nil, nil, [NSApp mainWindow], self, nil, nil, nil,
@"You sneaky thing!");
}
if ((flags & NSCommandKeyMask) && (flags & NSShiftKeyMask)) {
NSBeginInformationalAlertSheet(@"Modifier keys Command Shift detected", nil, nil, nil, [NSApp mainWindow], self, nil, nil, nil,
@"You sneaky thing!");
}
if ((flags & NSAlphaShiftKeyMask)) {
NSBeginInformationalAlertSheet(@"Modifier keys Caps Lock detected", nil, nil, nil, [NSApp mainWindow], self, nil, nil, nil,
@"You sneaky thing!");
}
if ((flags & NSFunctionKeyMask)) {
NSBeginInformationalAlertSheet(@"Modifier keys fn detected", nil, nil, nil, [NSApp mainWindow], self, nil, nil, nil,
@"You sneaky thing!");
}
Comprobando para presionado:
-(void)keyDown:(NSEvent *)theEvent
{
if ([theEvent modifierFlags] & NSShiftKeyMask)
{
NSLog("Shift key was pressed");
}
}
Comprobando la liberación:
-(void)keyUp:(NSEvent *)theEvent
{
if(!([theEvent modifierFlags] & NSShiftKeyMask))
{
NSLog("Shift key was released");
}
}
Debe tenerse en cuenta que la función NSLog solo se llamará si SHIFT y luego se presiona alguna otra tecla.
¡Espero que esto ayude!
De la guía de manejo del evento Cocoa:
El método flagsChanged: puede ser útil para detectar la presión de las teclas modificadoras sin que se presione ninguna otra tecla simultáneamente. Por ejemplo, si el usuario presiona la tecla Opción por sí mismo, su objeto de respuesta puede detectar esto en su implementación de flagsChanged :.
Más detalles se pueden encontrar here .
La documentación para NSResponder también establece lo siguiente:
flagsChanged:
Informa al receptor que el usuario ha presionado o liberado una tecla modificadora (Mayús, Control, etc.).
- (void) flagsChanged: (NSEvent *) theEvent
En la documentación de la manzana:
Tienes que here
con las siguientes banderas modificadoras de NSEvent