2012-12-13 2 views
1

J'ai totalement personnalisé NSControl avec son entièrement personnalisé NSCell. Maintenant, je veux implémenter une interaction avec la souris. Par exemple lorsque l'utilisateur clique sur le contrôle Je veux changer l'état du contrôle à highlight donc les questions sont:NSControl et NSCell: Gérer l'état de la cellule dans le bon sens

1) Où dois-je faire face à l'événement de la souris? Dans le NSControl ou directement dans le NSCell?

Au moment, je travaille avec ce code dans la sous-classe 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) est l'état NSCell géré automatiquement par le NSControl? Si je mets le NSControl stete à highlight il sera reflété au NSCell?

3) et qu'en est-il des attributs activés? En ce moment j'écrit ce code dans le NSControl: Et ce code dans le NSControl

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

Avez-vous suggéré notamment de travailler avec l'événement de la souris avec une coutume NSControl + NSCell?

Répondre

0

Vous pouvez effectuer les opérations suivantes:

Créer un NSTrackingArea, qui permet de détecter si la souris est entré dans votre NSControl:

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

Ensuite, vous ajoutez votre trackingArea à votre NSControl:

[yourNSControl addTrackingArea:trackingArea]; 

Dans votre sous-classe NSControl, implémentez les deux

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

Là, vous pouvez faire quelque chose avec votre cellule sous votre contrôle, ou avec votre contrôle lui-même.

Espérons que ça aide

+0

Pourquoi dois-je modifier la zone de suivi? – MatterGoal

+0

Vous n'avez pas à le modifier du tout. C'est juste une approche propre, parce que votre sous-classe NSControl détecte tout seul lorsque la souris entre/sort et donc il peut agir sur elle. –

+0

J'ai besoin de simuler un comportement NSButton donc je n'ai pas besoin de savoir quand la souris entre/quitte mon contrôle. J'ai juste besoin de savoir quelle est la bonne façon de gérer l'événement de la souris sur un contrôle personnalisé. En ce moment j'essaie de le gérer au niveau NSCell. Pensez-vous que ce n'est pas une bonne idée? – MatterGoal