0

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

以便在您的 custom 中接受第一次鼠标单击事件NSView

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

于 2011-11-23T09:08:52.497 回答
0

这可能是因为您的观点不是关键。您可以为您的 NSMenu 设置一个委托,然后-menuWillOpen:您可以调用[boxView.window makeFirstResponder:boxView];它使其成为密钥。

于 2011-11-28T04:33:21.570 回答