Вам также потребуется переопределить -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];
}
Я быстро проверил это в своем приложении для управления. Я несколько раз продублировал элемент управления в файле nib, и он работал как положено.
Вам также может понадобиться:
- (void)awakeFromNib
{
[[self window] setAcceptsMouseMovedEvents:YES];
[self addTrackingRect:[self bounds] owner:self userData:NULL assumeInside:YES];
}
Я не думаю, что -setAcceptsMouseMovedEvents необходим, но я уверен, что код отслеживания прямоугольный. Вам также может потребоваться поэкспериментировать со значением параметра acceptInside:, но это задокументировано.