2012-06-22 14 views
6

Desidero impostare l'equivalente chiave "" (spazio) senza alcun modificatore per NSMenuItem (nel menu principale dell'app).NSMenuItem KeyEquivalent "" (spazio) bug

Come risulta dalla documentazione:

Per esempio, in un'applicazione che riproduce file multimediali, il comando Play può essere mappato solo “” (spazio), senza la chiave di comando. È possibile effettuare ciò con il seguente codice:

[menuItem setKeyEquivalent: @ ""];

[menuItem setKeyEquivalentModifierMask: 0];

Set di chiavi equivalenti, ma non funzionano. Quando premo il tasto "Spazio" senza i modificatori non succede nulla, ma funziona quando premo "Spazio" con il tasto modificatore "Fn".

Ho bisogno di usare "Spazio" senza modificatori. Qualsiasi aiuto per favore!

risposta

3

Ho avuto lo stesso problema. Non ho investigato molto, ma per quanto posso dire, la barra spaziatrice non "sembra" come una scorciatoia da tastiera per Cocoa, quindi viene instradata allo -insertText:. La mia soluzione era quella di creare una sottoclasse del NSWindow, prenderlo come va la catena di risponditore (presumibilmente si potrebbe sottoclasse NSApp invece), e inviarlo via al sistema di menu in modo esplicito:

- (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

Grazie per rispondi, funziona) – Kira

1

Ho appena sperimentando lo stesso problema con una torsione ...

L'equivalente chiave della barra spaziatrice funziona correttamente nella mia app mentre l'IBAction collegato di NSMenuItem si trova nel Delegato app.

Se metto IBAction in un controller dedicato, fallisce. Tutti gli altri equivalenti chiave di menu continuano a funzionare ma la barra spaziatrice non risponde (è ok con un tasto modificatore, ma non modificato "" non funzionerà).

Ho provato varie soluzioni alternative, come il collegamento diretto al controller o il collegamento tramite la catena di risposta, senza alcun risultato. Ho provato il codice modo:

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

e il modo in Interface Builder, il comportamento è lo stesso

ho cercato sottoclasse NSWindow, come da risposta di Justin, ma finora non sono riusciti a convincere quello per funzionare.

Quindi per ora mi sono arreso e trasferito questa una IBAzione al Delegato App dove funziona. Non considero questa soluzione come una soluzione, ma semplicemente faccio ... forse è un bug o (più probabilmente) semplicemente non capisco la messaggistica degli eventi e la catena di risposta abbastanza bene.

1

Su questo post perché ho bisogno di usare troppo spazio ma nessuna di quelle soluzioni funziona per me.

Così, I subclass NSApplication e utilizzare il selettore sendEvent: con la 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; 
    } 
} 

auguriamo che contribuiscano

Problemi correlati