NSControl и NSCell: правильно управляйте состоянием ячейки

У меня совершенно обычай NSControl с его полностью на заказ NSCell, Теперь я хочу реализовать взаимодействие с мышью. Например, когда пользователь нажимает на элемент управления, я хочу изменить состояние элемента управления на highlight Итак, вопросы:

1) Где мне приходится иметь дело с мышью? в NSControl или прямо в NSCell?

В данный момент я работаю с этим кодом в подклассе NSCell:

-(BOOL)startTrackingAt:(NSPoint)startPoint inView:(NSView *)controlView{
    [self setHighlighted:YES];

    return YES;
}

-(void)stopTracking:(NSPoint)lastPoint at:(NSPoint)stopPoint inView:(NSView *)controlView mouseIsUp:(BOOL)flag{
    [self setHighlighted:NO];
}

2) Является ли NSCell состояние автоматически управляется NSControl? Если я установлю NSControl поехать в highlight это будет отражено NSCell?

3) а как насчет включенных атрибутов? На данный момент я написал этот код в NSControl: И этот код в NSControl

-(void)setEnabled:(BOOL)flag{
    [super setEnabled:flag];
    [[self cell]setEnabled:flag];
    [self updateCell:[self cell]];
}

У вас есть конкретное предложение по работе с событием мыши с пользовательским NSControl+NSCell?

1 ответ

Вы можете сделать следующее:

Создайте NSTrackingArea, который будет определять, попала ли мышь в ваш NSControl:

NSTrackingArea* trackingArea = [[[NSTrackingArea alloc] initWithRect:yourNSControlBoundsRect options:NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways owner:yourNSControl userInfo:nil];

Затем вы добавляете отслеживание области в ваш NSControl:

[yourNSControl addTrackingArea:trackingArea];

В вашем подклассе NSControl реализовать оба

 - (void)mouseEntered:(NSEvent *)theEvent
 - (void)mouseExited:(NSEvent *)theEvent

Там вы можете сделать что-то с вашей клеткой внутри вашего контроля, или с вашим контролем.

надеюсь, это поможет

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