右键单击NSStatusBarButton时调用Action

Dev*_*per 7 macos cocoa nsstatusitem nsstatusbar swift

我正在寻找一种方法来检测何时NSStatusBarButton右键单击(使用Swift)并调用操作.

我目前正在这样设置:

let statusItem = NSStatusBar.systemStatusBar().statusItemWithLength(-1)

func applicationDidFinishLaunching(aNotification: NSNotification) {
    // Insert code here to initialize your application
    if let button = statusItem.button {
        button.image = NSImage(named: "myImage")
        button.alternateImage = NSImage(named: "myImage")
        button.action = Selector("myAction")
    }
}
Run Code Online (Sandbox Code Playgroud)

我想过使用button.rightMouseDown(<#theEvent: NSEvent#>)(因为没有这样的"alternateAction"),但不幸的是,由于我刚开始编写Mac应用程序,我无法想出一些东西.

更新:

在寻找一种方法时,我看到一些线程告诉子类a,NSView但我不知道它应该如何工作(这可能是因为我对编程很新,甚至不知道如何"子类").我仍然认为有一些更简单的方法可以使用它,因为statusBar我所知道的几乎所有应用程序都依赖于右键.

Cod*_*ent 4

您可以子类化并重写该mouseDown方法,但自 Mac OS X 10.10 (Yosemite) 以来,出现了一种更简单的方法:NSGestureRecognizer及其子类:

func applicationDidFinishLaunching(aNotification: NSNotification) {
    // Insert code here to initialize your application
    if let button = statusItem.button {
        button.image = NSImage(named: "myImage")
        button.alternateImage = NSImage(named: "myImage")
        button.action = Selector("myAction")

        // Add right click functionality
        let gesture = NSClickGestureRecognizer()
        gesture.buttonMask = 0x2 // right mouse
        gesture.target = self
        gesture.action = "myRightClickAction:"
        button.addGestureRecognizer(gesture)
    }
}

func myRightClickAction(sender: NSGestureRecognizer) {
    if let button = sender.view as? NSButton {
        // Handle your right click event here
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 首先感谢您的回答。不幸的是我遇到了一个非常奇怪的问题。使用“buttonMask = 0x2”它根本没有检测到右键单击,但将掩码更改为“0x1”不知何故它检测到正常的左键单击。这对我来说似乎很奇怪,因为我根本没有改变任何其他东西。 (3认同)