Почему для моего интерактивного окна требуется двойной щелчок, чтобы число кликов было равно 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

person YannickB    schedule 23.11.2011    source источник


Ответы (2)


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

person Alex Zielenski    schedule 28.11.2011
comment
создание ключа помогло, но не так, как вы это описали! Спасибо, в любом случае!! stackoverflow.com/ questions / 1395556 / - person YannickB; 28.11.2011

Похоже, вам тоже нужно это сделать:

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

так что события первого щелчка мыши принимаются в вашем пользовательском _ 2_.

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

person petert    schedule 23.11.2011