0

カスタムNSViewを含むNSMenuItemを持つNSStatusItemがあります。このNSViewには、クリック可能なNSBoxの3つのサブビューが含まれています(mouseDownイベントを実装)。不思議なことに、アプリケーションを実行し、「再生」ボタンを押した直後にstatusItemを入力すると、NSBoxを1回クリックする必要があります(これにより、clickCount = 1が返されます)。別のウィンドウまたはビューに入ってstatusItemに戻り、NSBoxの1つをクリックしようとすると、何も起こりません。アイテムをダブルクリックすると、アクションが発生し、clickCountも1になります。

-(void)mouseDown:(NSEvent *)theEvent {
    NSLog(@"ClickCount: %ld", theEvent.clickCount);
    if ([delegate respondsToSelector:@selector(boxClicked:)]) {
        [delegate boxClicked:self];
    }
}

なぜこれが起こっているのか、そしてどうすればこれを解決できるのか、誰かが知っていますか?

編集(完全なmファイルコード):

#import "ClickableBox.h"

@implementation ClickableBox

@synthesize delegate;

- (BOOL)acceptsFirstMouse:(NSEvent *)theEvent
{
    return YES;
}

- (void)viewDidMoveToWindow {
    [self addTrackingRect:[self bounds] owner:self userData:NULL assumeInside:NO];
}

-(void)mouseEntered:(NSEvent *)theEvent {
    if ([delegate respondsToSelector:@selector(boxRolledOver:)]) {
        [delegate boxRolledOver:self];
    }
}

-(void)mouseExited:(NSEvent *)theEvent {
    if ([delegate respondsToSelector:@selector(boxExited:)]) {
        [delegate boxExited:self];
    }
}

-(void)mouseDown:(NSEvent *)theEvent {
    NSLog(@"ClickCount: %ld", theEvent.clickCount);
    if ([delegate respondsToSelector:@selector(boxClicked:)]) {
        [delegate boxClicked:self];
    }
}

- (void)dealloc {
    [delegate release];
    [super dealloc];
}

@end
4

2 に答える 2

2

これも行う必要があるように聞こえます:

- (BOOL)acceptsFirstMouse:(NSEvent *)theEvent
{
  return YES;
}

最初のマウスクリックイベントがカスタムで受け入れられるようにしますNSView

他の問題があるかもしれませんが、コードスニペットからそのままではわかりません。

于 2011-11-23T09:08:52.497 に答える
0

これは、あなたの見解が重要ではないことが原因である可能性があります。NSMenuのデリゲートを設定し、-menuWillOpen:呼び出し[boxView.window makeFirstResponder:boxView];てキーにすることができます。

于 2011-11-28T04:33:21.570 に答える