Несколько настраиваемых элементов управления, использующих мышь, перемещаются в одном окне

Сначала у меня было одно окно с моим настраиваемым элементом управления. Чтобы заставить его принимать события перемещения мыши, я просто вставляю его awakeFromNib:

Код:

[[собственное окно] makeFirstResponder: self]; [[собственное окно] setAcceptsMouseMovedEvents: ДА];

Теперь я что-то делаю с четырьмя из них в одном окне, и это уже не так красиво. Во-первых, я вынул их из-под контроля awakeFromNib и решил использовать свой appController для управления им, то есть [window makeFirstResponder: View]

Мой вопрос: как мне управлять четырьмя из них в одном представлении, если я хочу, чтобы каждый из них реагировал на события перемещения мыши? Прямо сейчас я сказал окну реагировать на события mouseMoved, но ни одно из представлений не отвечает на события mouseMoved.


person cemulate    schedule 02.02.2009    source источник


Ответы (1)


Вам также необходимо переопределить -acceptsFirstResponder, чтобы вернуть YES.

    #pragma mark NSResponder Overrides
    - (BOOL)acceptsFirstResponder
    {
    return YES;
    }

События -mouseMoved дороги, поэтому я отключаю события перемещения мыши, когда вызывается сообщение моего элемента управления -mouseExited, и включаю его в -mouseEntered.

    - (void)mouseEntered:(NSEvent *)theEvent
{
    [[self window] setAcceptsMouseMovedEvents:YES];
    [[self window] makeFirstResponder:self];
}

- (void)mouseMoved:(NSEvent *)theEvent
{
...
}

- (void)mouseExited:(NSEvent *)theEvent
{
    [[self window] setAcceptsMouseMovedEvents:NO];
}

Я быстро протестировал это в своем приложении для настраиваемого управления. Я несколько раз продублировал элемент управления в файле пера, и он работал, как ожидалось.

Также вам могут понадобиться:

- (void)awakeFromNib
{
    [[self window] setAcceptsMouseMovedEvents:YES];
    [self addTrackingRect:[self bounds] owner:self userData:NULL assumeInside:YES];
}

Я не думаю, что -setAcceptsMouseMovedEvents необходим, но я почти уверен, что это код отслеживания. Вам также может потребоваться поэкспериментировать со значением параметра acceptInside :, но это задокументировано.

person Mark    schedule 02.02.2009
comment
Я добавил mouseEntered: и mouseExited: и реализовал их, как указано выше, но он не вызывает методы (NSLog внутри не отображается). Кроме того, что означает #pragma mark Overrides NSResponder Overrides - person cemulate; 03.02.2009
comment
Я немного обновил ответ, что забыл. '#Pragma mark' - это директива, которую XCode анализирует и добавляет элемент во всплывающее меню функции, чтобы помочь найти различные места в вашем коде. Компилятор полностью игнорирует это. Использование тире (-) в качестве строки помещает в меню пункт-разделитель. - person Mark; 03.02.2009