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
Там вы можете сделать что-то с вашей клеткой внутри вашего контроля, или с вашим контролем.
надеюсь, это поможет