2016-06-09 21 views
0

Ich habe ein NSStatusItem mit einer benutzerdefinierten Ansicht (TimeView) festgelegt, aber dies blockiert den Klick von der Anzeige des NSMenu mit der NSStatusItem verbunden. Wenn ich die Ansicht für die NSStatusItem deaktiviere, dann wird das Menü korrekt angezeigt, wenn ich es jedoch aktiviere, passiert nichts, wenn ich auf die Ansicht klicke.Menü für NSStatusItem mit Ansicht anzeigen

class AppDelegate: NSObject, NSApplicationDelegate { 

    @IBOutlet weak var statusMenu: NSMenu! 

    let statusItem = NSStatusBar.systemStatusBar().statusItemWithLength(NSVariableStatusItemLength) 


    func applicationDidFinishLaunching(aNotification: NSNotification) { 
     statusItem.view = TimeView(statusItem: statusItem)//Commenting out this line provides the correct functionality for displaying the menu 
     statusItem.menu = statusMenu 
    } 

    func applicationWillTerminate(aNotification: NSNotification) { 
     // Insert code here to tear down your application 
    }  

} 

Vielen Dank, Ben

Antwort

0

So fand ich einen Weg, dies zu erreichen. Sie können NSStatusItem 's popUpStatusItemMenu(menu: NSMenu) Methode verwenden, um das Menü in den Ansichten mouseDown(event: NSEvent) Methode anzuzeigen.

Dies ist jedoch nicht die Hervorhebung des NSStatusItem. Der einfachste Weg, den ich finden könnte, besteht darin, die Ansicht an die Adresse NSMenuDelegate anzupassen und sie als Menüdelegierten festzulegen. Dann können Sie die Methoden menuWillOpen(menu: NSMenu) und menuDidClose(menu: NSMenu) auf folgende Weise überschreiben:

func menuWillOpen(menu: NSMenu) { 
    drawHighlight(true) 
} 

func menuDidClose(menu: NSMenu) { 
    drawHighlight(false) 
} 

func drawHighlight(highlight:Bool) { 
    let image = NSImage(size: self.frame.size) 
    image.lockFocus() 
    statusItem.drawStatusBarBackgroundInRect(self.bounds, withHighlight: highlight) 
    image.unlockFocus() 
    self.layer?.contents = image 
}