NSDatePicker in NSStatusBar NSSMenuItem empfängt keine Eingabe

8

Vor einiger Zeit habe ich ein einfaches Kalender-Menüleisten-Widget namens Day-O geschrieben. Der Kalender verwendet den NSDatePicker-Bestand, der in einem NSView innerhalb eines NSMenuItem in einem zu einem NSStatusItem hinzugefügten NSMenu verschachtelt ist. Die App hat eine activationPolicy von .accessory (die ursprünglich über den bool-Befehl "Application is agent" von plist gesetzt wurde). Irgendwann (vielleicht mit dem El Capitan Update?) Reagierte der Kalender nicht mehr auf Eingaben. Wenn die App zum ersten Mal gestartet wird, können Sie auf das Statusleistenelement klicken, um das Menü zu erweitern und mit dem Kalender zu interagieren, und es reagiert wie erwartet auf Benutzereingaben. Sobald die Anwendung jedoch den ursprünglichen Fokus verliert, reagiert der Kalender nicht mehr auf Eingaben.

Ich denke, dass ich das Problem verfolgt habe, bis die App nicht aktiviert wurde, nachdem ich aktiv zurückgetreten bin. Das Problem ist, dass, wenn ich versuche, die App manuell zu aktivieren, wenn das Menüleiste Element angeklickt wird (mit NSApp.activate(ignoringOtherApps:true) ) das Menü (Sie gerade geöffnet) wird entlassen.

Ich habe auch versucht, das Fenster anzuweisen, den NSDatePicker zum ersten Responder zu machen, aber das scheint auch keinen Effekt zu haben.

Wie bekomme ich NSDatePicker in einem Menüelement, um Benutzereingaben zu akzeptieren, wenn die Statusleisten-App nicht die aktive App ist?

Bearbeiten: Einfachster Code zur Veranschaulichung des Problems (fügen Sie dies zu einem AppDelegate in einer neuen Mac OS Cocoa App hinzu):

%Vor%

Starten Sie die App, klicken Sie auf den Menüeintrag und klicken Sie auf den Kalender. Klicken Sie dann auf eine andere App und dann erneut auf den Menüpunkt. Der Kalender reagiert nicht mehr auf Klicks.

    
Shaun Inman 09.10.2016, 13:52
quelle

1 Antwort

5

Ihr NSDatePicker muss "acceptsFirstMouse" als "true" zurückgeben, was readonly ist, also tun Sie das in einer Unterklasse.

Funktioniert in einem Testprojekt, in dem der von Ihnen bereitgestellte Code ausgeführt wird.

    
elasticthreads 10.10.2016, 13:41
quelle