NSStatusItem et Custom View figees/non mises a jour

hdexhdex Membre
17:33 modifié dans API AppKit #1
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  o:) ... ca resemble a un truc genre runloop ou thread mais si c'est le cas je comprends pas bien pourquoi.

Réponses

  • hdexhdex Membre
    17:33 modifié #2
    Ke me reponds a moi meme car en fouillant un peu plus dans les docs de NSStatusItem et NSMenu (http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/MenuList/Articles/ViewsInMenuItems.html),
    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 ...
  • AliGatorAliGator Membre, Modérateur
    février 2010 modifié #3
    méthodes de NSTimer, "scheduleInRunLoop" (ou qqch comme ça)

    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")
  • hdexhdex Membre
    17:33 modifié #4
    Merci Aligator,

    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 ....
Connectez-vous ou Inscrivez-vous pour répondre.