Почему моему кликабельному окну требуется двойной клик, чтобы количество кликов равнялось 1?

У меня есть NSStatusItem, который имеет NSMenuItem, который содержит пользовательский NSView. этот NSView содержит 3 подпредставления NSBox, которые можно активировать (реализовано событие mouseDown). Странно, но когда я запускаю приложение и ввожу statusItem сразу после нажатия кнопки "Play", мне нужно щелкнуть 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 ответа

Решение

Это может быть потому, что ваше мнение не является ключевым. Вы можете установить делегата для вашего NSMenu и на -menuWillOpen: ты можешь позвонить [boxView.window makeFirstResponder:boxView]; сделать это ключом.

Звучит так, будто вам также нужно сделать это:

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

так что первые события щелчка мышью принимаются в вашем обычае NSView,

Могут быть и другие проблемы, но они не могут быть понятны из фрагмента кода как есть.

Другие вопросы по тегам