Ich schreibe eine einfache Statusleiste App in Swift, und versuchen, die neue NSStatusItem API in OS X 10.10 eingeführt.Swift: NSStatusItem Menü Verhalten in 10.10 (z. B. nur mit der rechten Maustaste zeigen)
Die Schnittstelle, auf die ich ziele, ist ein einfacher linker Mausklick auf das statusItem, um eine Kernfunktion ein- und auszuschalten, mit einem rechten Mausklick (oder Control-Klick), um ein Einstellungsmenü anzuzeigen. Ich brauche keine benutzerdefinierte Ansicht oder Popover für diese Funktionalität.
Wenn ein NSMenu einem NSStatusItem zugewiesen ist, wird standardmäßig das Menü sowohl mit Linksklick als auch mit Rechtsklick angezeigt. Ich möchte das Verhalten ändern, um nur das Menü auf einen Rechtsklick zu zeigen, oder als eine Umgehungsmöglichkeit, das Menü bei einem Linksklick zu öffnen
Bisher scheint es, dass die Steuerung von Mausereignissen auf einem NSStatusItem, eins musste eine benutzerdefinierte Ansicht mit überschriebenen Mausereignissen einstellen (siehe this related question).
Im neuen NSStatusItem API, das in 10.10 eingeführt wurde, sind Methoden zum Festlegen einer benutzerdefinierten Ansicht veraltet, und es sieht nicht danach aus, als ob von diesem Verhalten abgeraten wird. Laut @ Taylor in this answer sollten einige der veralteten Verhaltensweisen über das NSStatusBarButton-Objekt verwendet werden, das von statusItemObject.button() zurückgegeben wird, aber zum Schreiben gibt es keine Dokumentation für NSStatusBarButton, und das zurückgegebene Objekt ist schreibgeschützt und kann nicht durch ersetzt werden eine benutzerdefinierte Schaltfläche mit überschriebenen Mausereignishandlern.
Gibt es eine Möglichkeit, ein gewisses Maß an Kontrolle darüber zu erlangen, ob ein NSMenu, das an ein NSStatusItem (oder ein NSStatusBarButton) angehängt ist, in Bezug auf Mausereignisse angezeigt wird?
Ein paar Notizen (die folgenden Schnipsel sind in Swift): a) Sie können die nach einem Rechtsklick verbleibende Hervorhebung lösen, indem Sie 'item.highlightMode = false' für das StatusItem-Objekt setzen. b) Der Fall für die primäre Aktion sollte zuerst im letzten Else-Block (vor 'self.statusItemAction = JUNStatusItemActionNone;') für das gewünschte Verhalten kommen. Andernfalls setzen Sie den Wert von 'self.statusItemAction' und prüfen sofort, ob es etwas anderes ist. – AmusedToDeath