События мыши, истекающие кровью через NSView - PullRequest
6 голосов
/ 06 июля 2011

У меня есть NSView, который охватывает представление содержимого родительского окна.В этом представлении есть обработчик события щелчка, который удаляет его из представления содержимого.Внутри этой точки зрения у меня есть другая точка зрения.Когда я перетаскиваю мышь в этом внутреннем виде, события мыши применяются не только к виду спереди, но и к видам сзади.Кроме того, появляются курсоры из представлений позади.Это та же самая проблема, возникающая здесь: Наложение NSView передает события мыши нижележащим подпредставлениям? , но ответ там не будет работать для моего проекта, потому что я не могу открыть другое окно.

Ответы [ 2 ]

14 голосов
/ 06 июля 2011

Не видя вашего кода обработки событий, трудно понять, что происходит, но я подозреваю, что вы, возможно, вызываете super реализацию различных методов обработки событий в ваших реализациях.

NSViewявляется подклассом NSResponder, поэтому по умолчанию необработанные события передаются по цепочке респондента.Суперпредставление представления является следующим объектом в цепочке респондента, поэтому, если вы вызовете, например, [super mouseDown:event] в вашей реализации ‑mouseDown:, событие будет передано суперпредставлению.

Исправлениечтобы убедиться, что не вызывает super реализацию в ваших обработчиках событий.

Это неверно:

- (void)mouseDown:(NSEvent*)anEvent
{
    //do something
    [super mouseDown:event];
}

Это правильно:

- (void)mouseDown:(NSEvent*)anEvent
{
    //do something
}
2 голосов
/ 08 февраля 2013

Ответ Роба и комментарий Маз на этот ответ решают эту проблему, но только для того, чтобы сделать ее абсолютно явной.Для того, чтобы NSView не передавал свои события мыши родительскому объекту, необходимо реализовать пустые методы.

// NSResponder =========================================
- (void) mouseDown:(NSEvent*)event {}
- (void) mouseDragged:(NSEvent*)event {}
- (void) mouseUp:(NSEvent*)event {}
...