7

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")
    }
}

(そのような「alternateAction」がないため)を使用することを考えbutton.rightMouseDown(<#theEvent: NSEvent#>)ましたが、残念ながら、Mac アプリのプログラミングを始めたばかりであるという事実のために、何かを思いつくことができませんでした。

アップデート:

これを行う方法を探しているときに、いくつかのスレッドが a をサブクラス化するように指示しているのを見ましたNSViewが、これがどのように機能するかわかりません (これは、プログラミングに本当に慣れておらず、「サブクラス化」する方法さえ知らないためである可能性があります)。statusBarそれでも、私が知っているほぼすべてのアプリが右クリックで直るので、これを使用する簡単な方法があると思いました。

4

3 に答える 3

3

メソッドをサブクラス化してオーバーライドすることができます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
    }
}
于 2015-08-26T02:11:55.247 に答える
2

受け入れられた回答の方法であなたと同じ問題がありました.buttonMask 0x2では機能せず、buttonMask 0x1のみで機能しました。通常NSButtonの s (ただし ではありませんNSStatusBarButtons) はNSClickGestureRecognizers を処理できるため、おそらくそれが回答者が考えていたことです。私が提案した別の解決策は、 を の独自のカスタム サブクラスのインスタンスにNSStatusItem設定することでしたが、OS X v10.10 の時点で、取得または設定は推奨されていないため、そうしたくありませんでした。viewNSViewview

のカスタム サブクラスをのボタンの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];
于 2016-08-06T21:01:03.880 に答える