为什么我的可点击框需要双击才能获得等于1的clickcount?

时间:2011-11-23 09:01:37

标签: macos cocoa nsmenuitem mousedown nsbox

我有一个NSStatusItem,它有一个包含自定义NSView的NSMenuItem。这个NSView包含3个可点击的NSBox子视图(实现了mouseDown事件)。奇怪的是,当我运行应用程序并且在按下“播放”按钮后立即进入statusItem时,我必须单击一次NSBox(这将返回clickCount = 1)。当我进入另一个窗口或视图,我回到statusItem,我尝试单击其中一个NSBox没有任何反应。当我双击项目时,操作发生,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

2 个答案:

答案 0 :(得分:2)

听起来你还需要这样做:

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

以便在自定义NSView中接受第一次鼠标点击事件。

可能还有其他问题,但无法按原样从代码段中说明。

答案 1 :(得分:0)

这可能是因为您的观点不是关键。您可以为NSMenu设置代理,在-menuWillOpen:上,您可以致电[boxView.window makeFirstResponder:boxView];以使其成为密钥。