1

Je veux remplacer le bouton d'actualisation avec indicateur d'activité lorsque l'utilisateur appuie sur le bouton d'actualisation et après que la tableview est actualisé, je souhaite le redéfinir sur le bouton d'actualisation. Mais lorsque j'appuie sur le bouton d'actualisation, le bouton d'actualisation n'est pas activé, mais le bouton d'actualisation est mis en surbrillance jusqu'à ce que le rechargement des données soit terminé.Remplacer UIBarButtonItem avec UIActivityIndicatorView ne fonctionne pas

le code est le suivant. Ai-je manqué quelque chose?

-(void) reloadNewsStarted{   
UIActivityIndicatorView *activityIndicatorRightBarItem = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 20, 20)]; 
[activityIndicatorRightBarItem startAnimating]; 
UIBarButtonItem *activityItem = [[UIBarButtonItem alloc] initWithCustomView:activityIndicatorRightBarItem]; 
[activityIndicatorRightBarItem release]; 
self.navigationItem.rightBarButtonItem = activityItem; 
[activityItem release]; 

[self reloadNewsEnded]; 
} 

-(void) reloadNewsEnded { 

//reload data process 

UIBarButtonItem *reloadNewsBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(reloadNewsStarted)]; 
reloadNewsBtn.style = UIBarButtonItemStyleBordered; 
self.navigationItem.rightBarButtonItem = reloadNewsBtn; 
[reloadNewsBtn release]; } 

Répondre

2

Au lieu d'écrire

[self reloadNewsEnded]; 

S'il vous plaît écrire

[NSThread detachNewThreadSelector:@selector(reloadNewsEnded) toTarget:self withObject:nil]; 

cette ligne de départ nouveau thread en arrière-plan afin que l'indicateur d'activité & le rechargement des données se fera simultanément dans deux fils.

+0

Merci beaucoup. Ça marche!!! – moon

0

pourquoi cette ligne à la fin de la méthode reloadNewStarted

[self reloadNewsEnded]; 

il semble annuler simplement les modifications apportées à la touche? Vous devez attendre que l'action soit terminée avant de l'appeler

+0

merci beaucoup pour votre aide. J'ai des codes de rechargement de données dans - (void) reloadNewsEnded. - (void) reloadNewsEnded {// recharger le processus de données // réaffecter le bouton d'actualisation} où dois-je attendre? – moon

0

La modification du bouton ne prendra effet que lorsque la boucle d'exécution récupérera le contrôle de votre code. Il semble que votre opération de rechargement soit synchrone et bloque la file d'attente des événements, ce qui ne permettra pas que cela se produise. Si votre traitement prend beaucoup de temps, vous devez utiliser un thread d'arrière-plan ou un traitement asynchrone sur la boucle d'exécution principale (par exemple, en utilisant NSURLConnection pour gérer une tâche réseau et des rappels) afin de ne pas bloquer.