NSStatusItem et Custom View figees/non mises a jour
hdex
Membre
Bonjour a tous,
J'ai une appli que je converti pour tourner dans la menubar. Je me suis donc creer un NSStatusItem et quelques custom View dans mon menu.
Tout marche sauf (ben oui, il faut bien un truc qui cloche) mes custom view ne se mettent pas a jour si le menu est affiche.
Ces vues n'ont rien de compliquées, juste quelques champs texte et des images mis a jour via des bindings.
En regardant les logs, il semble que le fait d'activer le NSStatusItem et d'afficher le menu stoppe l'execution de mon appli. J'ai essaye d'utiliser performSelectorOnMainThread pour mettre a jour les valeurs lie au Bindings mais sans succes.
Si quelqu'un a une idee ... ca resemble a un truc genre runloop ou thread mais si c'est le cas je comprends pas bien pourquoi.
J'ai une appli que je converti pour tourner dans la menubar. Je me suis donc creer un NSStatusItem et quelques custom View dans mon menu.
Tout marche sauf (ben oui, il faut bien un truc qui cloche) mes custom view ne se mettent pas a jour si le menu est affiche.
Ces vues n'ont rien de compliquées, juste quelques champs texte et des images mis a jour via des bindings.
En regardant les logs, il semble que le fait d'activer le NSStatusItem et d'afficher le menu stoppe l'execution de mon appli. J'ai essaye d'utiliser performSelectorOnMainThread pour mettre a jour les valeurs lie au Bindings mais sans succes.
Si quelqu'un a une idee ... ca resemble a un truc genre runloop ou thread mais si c'est le cas je comprends pas bien pourquoi.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
j'ai trouve ca :
[tt][size=10pt]You can add animation to a menu item view as you would any other view (you set a timer to call setNeedsDisplay: or display), but because menu tracking occurs in the NSEventTrackingRunLoopMode, you must add the timer to the run loop in that mode.[/size][/tt]
J'en conclus que des qu'on clique sur le menu NSRunLoop change de mode et donc mon code ne tourne plus.
Reste plus qu'a trouver le moyen de contourner ca ...
Quand tu crées ton NSTimer, si tu fais "scheduledTimerWithXXX" ça te crée un timer et tu l'installe dans la foulée sur la RunLoop principale pour qu'il soit programmé (et donc déclenché à l'heure prévue).
Au lieu de ça, il faut que tu crées ton timer de façon plus classique avec timerWithTimeInterval:... et que tu l'installes ensuite manuellement sur la RunLoop, mais avec le bon mode. Cela se fait en récupérant la RunLoop principale, puis en faisant "addTimer:forMode:" avec le mode NSEventTrackingRunLoopMode.
Cela correspond au 2e point de la doc de NSTimer (paragraphe "Scheduling Timers in Run Loops")
LA solution .... super!
Seul petite modif, comme j'utilises NSURLConnection il va falloir que je mette ca dans une thread avec sa propre RunLoop puis faire les mises a jour graphique via le timer.
Encore merci pour la piste ....