Benutzerdefinierte NSView in NSMenuItem empfängt keine Mausereignisse

7

Ich habe ein NSMenu, das aus einem NSStatusItem mit popUpStatusItemMenu herauskommt. Diese NSMenuItems zeigen eine Reihe von verschiedenen Links, und jeder ist mit setAction verbunden: mit der openLink: -Methode eines Ziels. Dieses Arrangement funktioniert lange gut. Der Benutzer wählt einen Link aus dem Menü und die openLink: -Methode behandelt ihn dann.

Leider habe ich kürzlich beschlossen, mit der setView: -Methode von NSMenuItem zu experimentieren, um eine nettere / slicker-Schnittstelle bereitzustellen. Im Grunde habe ich gerade den Titel eingestellt, das NSMenuItem erstellt und dann setView: verwendet, um eine benutzerdefinierte Ansicht anzuzeigen. Das funktioniert einwandfrei, die Menüpunkte sehen gut aus und meine benutzerdefinierte Ansicht wird angezeigt.

Wenn der Benutzer jedoch einen Menüeintrag auswählt und die Maus freigibt, funktioniert die Aktion nicht mehr (d. h. openLink: wird nicht aufgerufen). Wenn ich einfach den Befehl setView: comment auskommentiere, dann funktionieren die Aktionen wieder (natürlich sind die Menüpunkte leer, aber die Aktion wird korrekt ausgeführt). Meine erste Frage ist deshalb, warum das Setzen einer Ansicht die Aktion von NSMenuItem bricht.

Kein Problem, dachte ich, ich werde es beheben, indem ich das mouseUp-Ereignis in meiner benutzerdefinierten Ansicht erkenne und meine Aktionsmethode von dort aus aufrufen. Ich habe diese Methode meiner benutzerdefinierten Ansicht hinzugefügt:

%Vor%

Kein Würfel! Diese Methode wird nie aufgerufen.

Ich kann Tracking-Rects festlegen und mouseEntered: -Ereignisse erhalten. Ich habe ein paar Tests in meine Routine mouseEntered geschrieben, wie folgt:

%Vor%

Und bekam folgende Antworten:

%Vor%

Ist das das Problem? "nicht isKeyWindow"? Vermutlich ist das nicht gut, weil Apples Dokumente sagen: "Wenn der Benutzer auf eine Ansicht klickt, die nicht im Schlüsselfenster ist, wird das Fenster standardmäßig nach vorne gebracht und zum Schlüssel gemacht, aber das Mausereignis wird nicht ausgelöst." Aber es muss einen Weg geben, diese Ereignisse zu erkennen. WIE?

Hinzufügen:

%Vor%

hat keinen Effekt, obwohl canBecomeKeyWindow YES ist.

    
Dennis 08.09.2009, 18:31
quelle

5 Antworten

12

Fügen Sie diese Methode zu Ihrem benutzerdefinierten NSView hinzu und es funktioniert gut mit Mausereignissen

%Vor%

Aber ich habe Probleme mit keyhandling, wenn Sie dieses Problem gelöst haben, können Sie vielleicht zu meiner Frage gehen und mir ein wenig helfen.

    
Lothar 07.08.2010 08:45
quelle
9

Fügen Sie dies Ihrer benutzerdefinierten Ansicht hinzu und Sie sollten in Ordnung sein:

%Vor%     
fabian 09.02.2010 19:57
quelle
4

Ich habe diese Methode meiner benutzerdefinierten Ansicht hinzugefügt, und jetzt funktioniert alles wunderbar:

%Vor%

Hoffe, das hilft!

    
Justin Voss 13.03.2010 05:56
quelle
-1

Vor kurzem musste ich eine benutzerdefinierte Ansicht für ein NSStatusItem anzeigen, ein normales NSMenu anzeigen, wenn ich darauf klicke und Drag & Drop-Operationen auf dem Statussymbol unterstütze.

Ich löste mein Problem hauptsächlich mit drei verschiedenen Quellen, die in diese Frage.

Ich hoffe, es hilft anderen Menschen.

    
Shumais Ul Haq 27.02.2013 11:57
quelle
-1

Siehe den Beispielcode von Apple namens CustomMenus Dort finden Sie ein gutes Beispiel in der ImagePickerMenuItemView-Klasse.

Es ist nicht einfach oder trivial, eine Ansicht in einem Menü wie ein normales NSMenuItem zu gestalten. Es gibt einige echte Entscheidungen und Kodierungen zu tun.

    
uchuugaka 26.02.2014 03:39
quelle

Tags und Links