2010-04-09 12 views
6

Ich habe eine NSMenu, die NSMenuItems mit benutzerdefinierten Ansichten enthält. Ich möchte es so, dass wenn die Alt-Taste gedrückt wird, die Menüpunkte einen Teil ihres Aussehens ändern würden (durch ihre Ansicht). Ich fand setAlternative in der NSMenuItem Dokumente, aber in der Praxis konnte ich es nur mit NSMenuItems ohne benutzerdefinierte Ansichten arbeiten. Sobald ich eine benutzerdefinierte Ansicht einstelle, werden alle Menüelemente angezeigt. Ich habe auch versucht, Tasten drücken Ereignisse während das Menü geöffnet war. Aufgrund der anderen Ausführungsschleife empfängt NSApplication's sendEvent: keine Ereignisse, bis das Menü geschlossen ist. Daher kann ich das eintreffende Ereignis nicht einfach abfangen.Alternative Menüelemente in NSMenu

Weiß jemand, wie ich benachrichtigt werden kann, ob durch Delegation oder Unterklassen, wann die Alt-Taste gedrückt wird, wenn ein Menü geöffnet wird?

Antwort

6

Sie sollten ein Objekt als Delegat Ihres Menüs festlegen und dann die Delegate-Methode implementieren.

Damit können Sie den Status Ihrer benutzerdefinierten Ansicht ändern, bevor der Menüeintrag angezeigt wird, basierend auf dem aktuellen Modifikatorstatus.

Sie können die aktuellen Modifikatoren erhalten, indem Sie nach [[NSApp currentEvent] modifierFlags] fragen.

Wenn Sie, wenn der Modifikator Flags ändern benachrichtigt werden müssen, während Ihr Menü geöffnet ist, implementieren die -flagsChanged: Methode in Ihrer benutzerdefinierten Ansicht:

- (void)flagsChanged:(NSEvent*)event 
{ 
    if ([event modifierFlags] & NSAlternateKeyMask) // check for option key 
    { 
     //do something 
    } 
    else 
    { 
     //do something else 
    } 
} 
+0

Ich brauche es zu geschehen, wenn das Menü geöffnet ist. Zum Beispiel, nicht wenn das Menü geöffnet wird, aber während es geöffnet ist, wenn der Benutzer mit alt drückt, brauche ich eine Benachrichtigung darüber. –

+0

Ich habe die Antwort mit Informationen zur '-flagsChanged' Methode aktualisiert. –

+0

Ich überschreibe - (BOOL) acceptsFirstResponder und - (BOOL) wirdFirstResponder, um YES in den benutzerdefinierten Sichtklassen meiner NSMenuItems zurückzugeben. Ich habe dann flagsChanged: implementiert. Ich habe den First-Responder des ersten Menüeintrags gemacht, wenn menuNeedsUpdate: FlagsChanged: wird jedoch immer noch nicht aufgerufen. Ich habe auch versucht, es nach einer Verzögerung von 0,5 (im Tracking-Event-Loop-Modus) zu reagieren, für den Fall, dass das Menü es irgendwie gestohlen hat. Das hat auch nicht funktioniert. Irgendwelche Ideen? –