2012-06-22 13 views
6

Quiero establecer la clave equivalente "" (espacio) sin ningún modificador para NSMenuItem (en el menú principal de la aplicación).NSMenuItem KeyEquivalente "" error (espacio)

Como se desprende de la documentación:

Por ejemplo, en una aplicación que reproduce archivos multimedia, el comando de reproducción se pueden mapear a sólo “” (espacio), sin la tecla de comando. Puede hacerlo con el siguiente código:

[menuItem setKeyEquivalent: @ ""];

[menuItem setKeyEquivalentModifierMask: 0];

Equivalente clave se establece con éxito, pero no funciona. Cuando presiono la tecla "Espacio" sin modificadores no sucede nada, pero funciona cuando presiono "Espacio" con la tecla modificadora "Fn".

Necesito usar "Espacio" sin modificadores. Cualquier ayuda por favor!

Respuesta

3

Tuve el mismo problema. No he investigado muy duro, pero por lo que puedo decir, la barra espaciadora no se "parece" como un atajo de teclado a Cocoa por lo que se enruta a -insertText:. Mi solución fue subclase el NSWindow, atraparlo, ya que sube la cadena de respuesta (es de suponer que podría subclase NSApp en su lugar), y enviarlo al sistema de menús de forma explícita:

- (void)insertText:(id)insertString 
{ 
    if ([insertString isEqual:@" "]) { 
     NSEvent *fakeEvent = [NSEvent keyEventWithType:NSKeyDown 
               location:[self mouseLocationOutsideOfEventStream] 
             modifierFlags:0 
              timestamp:[[NSProcessInfo processInfo] systemUptime] 
              windowNumber:self.windowNumber 
               context:[NSGraphicsContext currentContext] 
              characters:@" " 
          charactersIgnoringModifiers:@" " 
              isARepeat:NO 
               keyCode:49]; 
     [[NSApp mainMenu] performKeyEquivalent:fakeEvent]; 
    } else { 
     [super insertText:insertString]; 
    } 
} 
+0

Gracias por su respuesta, funciona) – Kira

1

acabo de estado experimentando la misma problema con un giro ...

El equivalente de la clave de la barra espaciadora funciona bien en mi aplicación, mientras que el IBAction vinculado al NSMenuItem se encuentra en el delegado de la aplicación.

Si muevo el IBAction a un controlador dedicado, falla. Todos los demás equivalentes de tecla de elemento de menú continúan funcionando pero la barra espaciadora no responde (está bien con una tecla de modificación, pero @ "" no modificado no funcionará).

He intentado varias soluciones, como la vinculación directa al controlador frente a la vinculación a través de la cadena de respuesta, fue en vano. Probé el camino código:

[menuItem setKeyEquivalent:@" "]; 
[menuItem setKeyEquivalentModifierMask:0]; 

y la forma en Interface Builder, el comportamiento es el mismo

He tratado de subclases NSWindow, según la respuesta de Justin, pero hasta ahora no han podido conseguir que funcione.

Así que por ahora me he rendido y reubicado este IBAction al delegado de la aplicación donde funciona. No considero esto como una solución, simplemente haciendo ... quizás sea un error, o (más probable) simplemente no entiendo los mensajes de eventos y la cadena de respuesta lo suficientemente bien.

1

Sube esta publicación porque también necesito espacio, pero ninguna de esas soluciones funciona para mí.

Así, I subclass NSApplication y utilice el sendEvent: con el justin k solution:

- (void)sendEvent:(NSEvent *)anEvent 
{ 
    [super sendEvent:anEvent]; 
    switch ([anEvent type]) { 
    case NSKeyDown: 
     if (([anEvent keyCode] == 49) && (![anEvent isARepeat])) { 

      NSPoint pt; pt.x = pt.y = 0; 
      NSEvent *fakeEvent = [NSEvent keyEventWithType:NSKeyDown 
                location:pt 
              modifierFlags:0 
               timestamp:[[NSProcessInfo processInfo] systemUptime] 
               windowNumber: 0 // self.windowNumber 
                context:[NSGraphicsContext currentContext] 
               characters:@" " 
           charactersIgnoringModifiers:@" " 
               isARepeat:NO 
                keyCode:49]; 
      [[NSApp mainMenu] performKeyEquivalent:fakeEvent]; 
     } 
     break; 

    default: 
     break; 
    } 
} 

esperan que ayude a

Cuestiones relacionadas