Question

Je suis en train d'utiliser un intérieur NSProgressIndicator (indéterminé) d'un menu statusbar. J'utilise un NSView-objet comme vue pour le menuitem, et puis subviews l'indicateur de progression pour l'afficher. Mais chaque fois que je tente d'appeler le DebuterAnimation: pour le progrès, rien ne se passe. Quand j'essaye faire la même chose sur une normale NSWindow il fonctionne parfaitement, mais pas quand à l'intérieur d'un élément de menu.

Je suis nouveau à la fois le cacao et objective-c donc je pourrais ai oublié quelque chose « évident » mais je l'ai cherché un peu pour une solution de contournement, mais sans succès. J'ai trouvé quelque chose menuitems ne peut pas être mis à jour et que tout montré, vous devez utiliser une fenêtre bordeless à la place. Mais je ne l'ai pas été en mesure de confirmer dans la documentation.

Edit:

Ok, fonctionne presque maintenant. Lorsque vous utilisez le setUsesThreadedAnimation: et d'un menuWillOpen de MenuDelegate et de créer un nouveau fil. Ce fil exécute une méthode locale:

-(void) doWork(NSProgressIndicator*) p{
     [p startAnimation:self];
}

Cela va démarrer la progressindicator au hasard (?) Lors de l'ouverture du menu. Si je l'appelle startAnimation: directement sans passer par doWork: (en utilisant encore un nouveau fil), ça ne marche jamais. Ne pas faire setUsesThreadedAnimation: la barre de progression créer son propre fil pour l'animation?

Était-ce utile?

La solution

Résolu en utilisant:

[progressIndicator performSelector:@selector(startAnimation:)
                            withObject:self
                            afterDelay:0.0
                               inModes:[NSArray 
                       arrayWithObject:NSEventTrackingRunLoopMode]];

A l'intérieur du menuWillOpen :, le problème semble avoir été appeler DebuterAnimation:. Avant le tirage a été fini lui-même progressbar

Autres conseils

Comment parlez-vous le NSProgressIndicator qui est dans la vue (et celle de la fenêtre, pour cette question)? Par exemple, avez-vous une classe de contrôleur qui a accroché jusqu'à de IBOutlet aux indicateurs de progrès? Si vous utilisez un IBOutlet, êtes-vous sûr qu'il est accroché correctement dans le fichier nib?

En outre, où et quand vous appelez startAnimation:? (Nous avons besoin de voir le code).

Une chose qui peut parfois se produire est que vous oubliez de brancher un IBOutlet dans la pointe. Ensuite, lorsque vous essayez de dire l'objet de faire quelque chose dans le code à l'exécution, le IBOutlet est nil, et donc ce que vous pensez est un message envoyé à votre objet est en fait, un message envoyé à nil. En d'autres termes, il est tout simplement ignoré, et ressemble effectivement comme cela ne fonctionne pas.

Pourvu que vous avez un (potentiellement) référence valide à l'objet de l'interface utilisateur, l'autre problème commun que vous verrez est quand un développeur tente d'envoyer un message à l'objet à « trop tôt » d'un temps. D'une manière générale, les méthodes de init sont trop tôt dans la vie de l'objet contrôleur pour pouvoir envoyer des messages à l'interface utilisateur des objets les années de IBOutlet sont encore nil. Par la -awakeFromNib de temps est appelé, de la IBOutlet doivent être valides (à condition que vous les accroché dans IB) et vous pouvez alors envoyer le message à l'objet de l'interface utilisateur.

Avez-vous dit à utiliser l'animation via -setUsesThreadedAnimation filetée:

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top