2010-02-13 12 views
7

Je travaille sur une application de minuterie simple, et j'ai créé un NSStatusItem avec un menu et j'ai des étiquettes NSTextField qui met à jour les étiquettes de minuterie() mais quand je clique sur le statut item le NSTimer s'arrête (et cesse de mettre à jour les étiquettes) ..... comment puis-je contourner ce problème?NSTimer avec une application de barre de menu

EDIT: est ici le code qui démarre le minuteur:

timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerDidUpdate:) userInfo:nil repeats:YES];

+0

va avoir besoin de voir le code où vous commencez et arrêter le chronomètre. Voulez-vous dire que la minuterie met à jour les étiquettes? – TechZen

+0

Oui ............ – nanochrome

+0

et il cesse de mettre à jour lorsque je clique sur l'élément d'état ne sais pas ce qui ne va pas. – nanochrome

Répondre

4

Je devine que le minuteur reprend dès que vous arrêtez d'interagir avec le NSStatusItem? (Après le bouton & bouton de la souris a rejeté le menu). L'interaction de l'utilisateur place la boucle d'exécution principale dans un mode où elle ne met pas à jour les minuteries, donc si votre étiquette doit continuellement être mise à jour, vous devrez probablement déplacer le NSTimer et le dessin d'étiquettes vers un processus séparé ou un autre fil.

+0

Désolé, je suis un peu nouveau à obj-c/cacao comment puis-je passer à un autre fil etc – nanochrome

+0

Si vous n'avez pas fait thread avant, il va falloir un peu de lecture: Thread Programming Guide: http://tinyurl.com/yjnlegr contextes Threading & graphiques: http://tinyurl.com/yflqjjk une solution plus simple pourrait consister à mettre en place un délégué pour votre menu, puis mettre en œuvre le menuWillOpen: & menuDidClose: méthodes de délégué pour effacer l'étiquette/vue lorsque le menu est ouvert (donc au moins l'utilisateur ne voit pas une étiquette périmée). –

11

Vous devez ajouter minuterie dans MainRunLoop comme indiqué ci-dessous:

NSRunLoop * rl = [NSRunLoop mainRunLoop]; 
[rl addTimer:timer forMode:NSRunLoopCommonModes]; 
+0

Cela semble vraiment être la réponse préférée. –

+0

Cela semble être de loin le moyen le plus facile de le faire. En outre, vous pouvez simplement le faire en une ligne avec '[[NSRunLoop currentRunLoop] addTimer: timer forMode: NSRunLoopCommonModes];' – seaturtle