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 stete на highlight, он будет отражаться на NSCell?

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

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

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


person MatterGoal    schedule 13.12.2012    source источник


Ответы (1)


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

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

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

Затем вы добавляете свою trackingArea в свой NSControl:

[yourNSControl addTrackingArea:trackingArea];

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

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

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

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

person Boris Prohaska    schedule 13.12.2012
comment
Почему я должен изменить область отслеживания? - person MatterGoal; 13.12.2012
comment
Вам вообще не нужно его модифицировать. Это просто чистый подход, потому что ваш подкласс NSControl сам определяет, когда мышь входит/выходит, и поэтому он может действовать на нее. - person Boris Prohaska; 13.12.2012
comment
Мне нужно имитировать поведение NSButton, поэтому мне не нужно знать, когда мышь входит/выходит из моего управления. Мне просто нужно знать, как правильно управлять событием мыши в пользовательском элементе управления. На данный момент я пытаюсь управлять им на уровне NSCell. Как вы думаете, это не очень хорошая идея? - person MatterGoal; 13.12.2012
comment
Что вы подразумеваете под событием мыши? Если это всего лишь щелчок внутри, вам может потребоваться переопределить -(void)mouseDown:(NSEvent*)theEvent или -(void)mouseUp:(NSEvent*)theEvent. Я бы сделал это на уровне управления, потому что если вы позже добавите к нему дополнительные подпредставления, вам не нужно будет менять какой-либо код. - person Boris Prohaska; 13.12.2012
comment
Спасибо за время, Борис. Прежде чем создавать этот вопрос, я использую именно то, что вы сказали в своем предыдущем комментарии. Но MouseUp не работал должным образом, прочитав некоторые другие неполные ответы, я понял, что правильный способ - работать с методом отслеживания в NSCell. Но это первый раз, когда я работаю с пользовательским контролем, и поэтому я хочу быть уверен, что мой выбор правильный. Вы сказали мне работать так, как я уже пробовал, и это не сработало. - person MatterGoal; 14.12.2012