2016-09-08 9 views
1

メニューバーアイコンを表示する小さなMac OSXアプリケーションを作成しています。クリックすると、メニューがポップアップします。Mac OSXのメニューバーアイコンのダブルクリックアクション

メニューバーのアイコンに「デフォルト」のアクションが必要です。基本的には、メニューからアクションを選択することなく、アクションをダブルクリックするときに実行します。

私はアップルのドキュメントを見て、NSStatusItemにはと呼ばれるものがありますが、それはソフトではなく、動作していないようです。より以上の、それはbuttonプロパティを使用しますが、そのコンパイラエラーの結果は以下の通りやろうとすると言うのドキュメント:

enter image description here

任意のコードや案内ははるかに高く評価され、感謝!

+0

ステータスバーの項目上でマウスの右ボタンを処理することができ、NSApp.currentEvent

self.statusItem.button.target = self; self.statusItem.button.action = @selector(clickOnStatusItem:); 

...また

- (void)clickOnStatusItem:(id)sender { if (NSApp.currentEvent.clickCount == 2) { // Double click on status item } } 

を使用することができますボタンの上に。ダブルアクションではありません。 – rocky

+0

もちろん、これはシングルクリックアクションであり、ダブルクリックではありません。シングルクリックでメニューがポップアップしてもOKです。私はダブルクリックのためのアクションを追加できるようにしたい。 – DarkByte

答えて

2

それが今日立っているような状況(Xcodeの7.3.1、OSX 10.11.4):

  • NSStatusItemdoubleActionは非推奨(と実際に動作していない)されます。
  • Appleはbuttonプロパティを使用するように指示しますが、doubleActionのヘッダーはありません(実装が存在するかどうかは疑問です)。ああ、それはまた、読み取り専用です。
  • NSStatusItemのいずれかのプロパティの左/右/右クリックに関するその他のオプションはありません。

回避策:ダブルクリックは、以下のように、検出された(Appleは話していたこととまったく同じ)NSButtonのカテゴリを作成して投稿することをカスタムクリックハンドラを実装通知:

@implementation NSButton (CustomClick) 

- (void)mouseDown:(NSEvent *)event { 
    if (self.tag != kActivateCustomClick) { 
     [super mouseDown:event]; 
     return; 
    } 

    switch (event.clickCount) { 
     case 1: { 
      [self performSelector:@selector(callMouseDownSuper:) withObject:event afterDelay:[NSEvent doubleClickInterval]]; 
      break; 
     } 
     case 2: { 
      [NSRunLoop cancelPreviousPerformRequestsWithTarget:self]; 
      [[NSNotificationCenter defaultCenter] postNotificationName:@"double_click_event" object:nil]; 
      break; 
     } 
    } 
} 

- (void)callMouseDownSuper:(NSEvent *)event { 
    [super mouseDown:event]; 
} 

@end 

ご覧のとおり、このハンドラは、特定のtag値を持つNSButtonインスタンスのみを処理します。

クリックが検出されると、処理のためにシステムのダブルクリック間隔でsuperへの呼び出しを延期します。その時間内に別のクリックが発生した場合は、superへのコールをキャンセルし、ダブルクリックとして処理します。

希望すると助かります!

0

あなたは、私はそれがアクションを設定することを意味だと思い