2016-10-09 2 views
8

Vor einer Weile schrieb ich ein einfaches Kalendermenüleiste Widget namens Day-O. 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 (ursprünglich eingestellt über die "Application ist Agent" bool). 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.NSDatePicker in NSStatusBar NSSMenuItem keine Eingabe

Ich denke, ich habe das Problem bis hin zur App nicht aktiv nach dem ersten Rücktritt aktiv verfolgt. 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 abgelehnt.

Ich habe auch versucht, das Fenster zu sagen, um den NSDatePicker zum Ersthelfer zu machen, aber das scheint auch keinen Effekt zu haben.

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


Edit: Simplest Code, um das Problem (fügen Sie diese zu einem AppDelegate in einem neuen macOS Cocoa app) zu veranschaulichen:

let statusItem = NSStatusBar.system().statusItem(withLength:NSVariableStatusItemLength) 
func applicationDidFinishLaunching(_ aNotification: Notification) { 
    NSApp.setActivationPolicy(.accessory) 

    statusItem.button?.title = "Calendar" 

    let menu = NSMenu() 
    let item = NSMenuItem() 
    let picker = NSDatePicker(frame: NSRect(x: 0, y: 0, width: 140, height: 148)) 
    picker.datePickerStyle = .clockAndCalendarDatePickerStyle 

    item.view = picker 
    menu.addItem(item) 

    statusItem.menu = menu 
} 

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

+0

Jetzt frage ich mich, ob die untere Ebene "Event Taps" API würde es mir erlauben, die Maus-Eingabe abzufangen, bevor es zum Statuselement kommt, damit ich die App aktivieren kann, bevor es das Menü öffnet ... –

Antwort

5

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

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

Verwandte Themen