web-dev-qa-db-fra.com

Texte UILabel non mis à jour

Je ne parviens pas à modifier le texte UILabel. Le code de l'UILabel dans viewDidLoad est:

startLabel=[[UILabel alloc] initWithFrame:CGRectMake(75, 395, 200, 30)];
startLabel.text=@"Recording Sound ...";
startLabel.backgroundColor=[UIColor clearColor];
startLabel.textColor=[UIColor whiteColor];
startLabel.font=[UIFont boldSystemFontOfSize:17];

[self.view addSubview:startLabel];

Plus tard, si je veux changer le libellé du texte avec le code suivant, cela ne change pas sur l'application:

startLabel.text=@"Searching Database ...";

ou

[startLabel setText:@"Searching Database ..."];

L'UILabel n'est pas vide, je l'ai imprimé pendant le débogage et il montre:

(gdb) po startLabel
<UILabel: 0x2c1a30; frame = (75 395; 200 30); text = 'Searching Database ...'; 
clipsToBounds = YES; userInteractionEnabled = NO; layer = <CALayer: 0x2ae8f0>>

Ainsi, le texte de l'étiquette change à l'intérieur de l'UILabel, mais ce n'est pas mis à jour à l'écran.

Quelqu'un peut-il me faire savoir ce qui me manque ici? Merci.

Edit 1: j'ai essayé performSelectorOnMainThread: - n'a pas fonctionné pour moi. Edit 2: J'utilise les classes AVFoundation et ASIHTTP pour enregistrer le son et télécharger le fichier enregistré ici. Rien d'autre. N'a utilisé aucun fil.

36
Ahsan

Vous pouvez rencontrer un problème avec le filetage comme mentionné dans les commentaires ci-dessus. Si vous avez une méthode qui s'exécute sur le thread principal et fait une certaine activité (telle que la recherche dans une base de données), les mises à jour que vous apportez à l'interface utilisateur ne seront pas validées jusqu'à ce que la boucle d'exécution prenne le contrôle. Donc, si vous avez une tâche longue et longue sur le thread principal, exécutez ce code après avoir défini le texte de l'étiquette:

- (void)doSomethingTimeConsuming
    ... consume some time ...
    ... set text of label ...
    [[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.5]];
    ... continue long operation ...
}

Cela devrait éliminer toutes les modifications d'interface que vous avez apportées. Bien que cela puisse être un hack sensé et fonctionnel, il ne bat pas l'alternative. Je vous suggère fortement d'effectuer les tâches fastidieuses de votre application sur un thread d'arrière-plan et de mettre à jour l'interface utilisateur via le thread principal à l'aide de performSelectorOnMainThread:withObject:waitUntilDone:. Voir la page d'Apple sur iOS Thread Management .

47
Alex Nichol

Dans mon cas, la fonction qui était en cours de mise à jour a été appelée à partir d'un outil de reconnaissance tactile sur un fil, mais à l'endroit de la fonction où je modifie la valeur de la propriété de texte de l'étiquette, je l'ai remise sur le fil principal:

dispatch_async(dispatch_get_main_queue(), ^{
    [self.someLabel setText:someString];
});
49
ndoc

Le mien est un peu plus inattendu, bien que raisonnable - mais ce n'est pas quelque chose auquel personne ne pense trop.

Je suis censé mettre à jour le UILabel lorsque je reçois un NSNotification que j'ai tiré ailleurs. Cependant, la notification a été déclenchée à partir d'un thread d'arrière-plan donc même les méthodes d'écoute qui mettent à jour le texte de l'étiquette sont déclenchées en arrière-plan.

Si vous comptez sur un NSNotification pour mettre à jour l'étiquette ou l'une de vos vues, déclenchez le NSNotification à partir du thread d'interface utilisateur principal.

3
Matthew Quiros

J'avais un UILabel montrant un numéro de niveau qui ne serait pas mis à jour vers le nouveau numéro de niveau sur un UIViewController. La seule solution viable que j'ai pu trouver qui a fonctionné était d'appeler setNeedsDisplay sur le thread principal du contrôleur de vue qui possédait l'UILabel

-(void)changeLevelLabel:(int)theLevel {
dispatch_async(dispatch_get_main_queue(), ^{
    self.levelLabel.text = [NSString stringWithFormat:@"%d",theLevel];
    [self.levelLabel setNeedsDisplay];
});

}

Voir http://iosdevelopmentjournal.com/blog/2013/01/16/forcing-things-to-run-on-the-main-thread/ pour une explication plus détaillée

2
user1233894