使用视图显示 NSStatusItem 的菜单

Show menu for NSStatusItem with view

我有一个设置了自定义视图 (TimeView) 的 NSStatusItem,但这会阻止点击显示与 NSStatusItem 关联的 NSMenu。如果我禁用 NSStatusItem 的视图,那么菜单会正确显示,但是,如果我启用它,那么当我单击视图时什么也不会发生。

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
    }    

}

非常感谢,本

所以我找到了实现此目的的方法。您可以使用 NSStatusItempopUpStatusItemMenu(menu: NSMenu) 方法在视图 mouseDown(event: NSEvent) 方法中显示菜单。

然而,这不会突出显示 NSStatusItem。我能找到的最简单的方法是使视图符合 NSMenuDelegate 并将其设置为菜单委托。然后你可以通过以下方式覆盖 menuWillOpen(menu: NSMenu)menuDidClose(menu: NSMenu) 方法:

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
}