簡體   English   中英

右鍵單擊NSStatusBarButton時調用Action

[英]Call Action when NSStatusBarButton is right-clicked

我正在尋找一種方法來檢測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")
    }
}

我想過使用button.rightMouseDown(<#theEvent: NSEvent#>) (因為沒有這樣的“alternateAction”)但不幸的是我沒有設法拿出一些東西,因為我剛開始編寫Mac應用程序。

更新:

在尋找一種方法時,我看到一些線程告訴子類NSView但我不知道它應該如何工作(這可能是因為我真的是編程新手,甚至不知道如何“子類”) 。 我仍然認為有一些更簡單的方法可以使用它,因為我知道幾乎所有的statusBar應用程序都是右擊。

您可以子類化並覆蓋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
    }
}

我使用接受的答案方法遇到了同樣的問題:它對buttonMask 0x2沒有用,只有buttonMask 0x1。 常規NSButton (但不是NSStatusBarButtons )可以處理NSClickGestureRecognizer ,所以也許這就是NSClickGestureRecognizer的想法。 我發現建議的另一個解決方案是將NSStatusItemview設置為您自己的NSView自定義子類的實例,但是從OS X v10.10開始,不贊成獲取或設置view ,所以我不想這樣做。

我通過添加NSView的自定義子NSView作為NSStatusItem按鈕的子視圖來解決這個問題。 我的NSView實現-rightMouseUp:接收鼠標右鍵事件,然后將該事件傳遞給我想要處理鼠標右鍵單擊事件的類給它的塊。

這是我的自定義子類:

#import <Cocoa/Cocoa.h>

@interface TTRightClickDetector : NSView

@property (copy) void (^onRightMouseClicked)(NSEvent *);

@end

#import "TTRightClickDetector.h"

並實施:

@implementation TTRightClickDetector

- (void)rightMouseUp:(NSEvent *)theEvent
{
    if(self.onRightMouseClicked)
    {
        self.onRightMouseClicked(theEvent);
    }
}

@end

以下是我如何使用它:

self.statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength];
NSStatusBarButton *button = self.statusItem.button;
button.image = [NSImage imageNamed:@"image"];
button.action = @selector(leftMouseClicked:);

TTRightClickDetector *rightClickDetector = [[TTRightClickDetector alloc] initWithFrame:button.frame];
rightClickDetector.onRightMouseClicked = ^(NSEvent *event){
    [self rightMouseClicked];
};
[button addSubview:rightClickDetector];

commanda的答案的快速版本(子類化NSView並實現mouseDown)。

NSView子類:

class RightMouseHandlerView: NSView {

    var onRightMouseDown: (()->())? = nil

    override func rightMouseDown(with event: NSEvent) {
        super.rightMouseDown(with: event)

        if onRightMouseDown != nil {
            onRightMouseDown!()
        }
    }
}

然后將其添加到狀態欄按鈕並設置代碼塊:

statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.squareLength)

if let button = statusItem.button {
    let rmhView = RightMouseHandlerView(frame: statusItem.button!.frame)
    rmhView.rightMouseDown = {
        // Do something when right mouse down on button
    }
    button.addSubview(rmView)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM