2010-10-16 3 views
2

J'ai un problème très étrange avec UINavigationController sur l'iphone et je me casse la tête contre le mur à ce sujet. En bref, j'exécute un appel à un serveur et lorsque cet appel échoue, j'échange la vue actuelle avec une vue contenant un message d'erreur. Le code en question est appelé sur le thread principal en utilisant performSelectorOnMainThreadUINavigationController présente une vue vide

Ce qui se passe en pratique est que sur l'appareil, il affiche un écran blanc vierge environ la moitié du temps. Sur le simulateur, il présente un écran vide à chaque fois, ce qui m'amène à penser qu'il s'agit peut-être d'un problème de synchronisation qui est plus important en raison des meilleures vitesses de traitement dans un simulateur. Cela fonctionne parfaitement si j'appelle la même fonction en cliquant sur un bouton dans l'interface utilisateur pour afficher la page, donc je ne pense pas que ce soit un problème avec le code lui-même.

J'ai vérifié que le contrôleur que j'ajoute est dans la pile de navigation. Vérifié il est appelé sur le fil principal, il est visible, la taille du cadre et l'emplacement sont corrects. J'ai essayé de définir explicitement la vue pour qu'elle soit visible, déplacée vers l'avant dans sa vue parente et appelée setNeedsDisplay et même appelée manuellement drawRect. Rien de tout cela ne fonctionne.

Des idées sur ce qui pourrait se passer ici? Je suppose qu'il a quelque chose à voir avec la boucle d'exécution, mais je ne peux pas le comprendre. L'aide serait très appréciée. Le code relativement simple en question est ci-dessous

UINavigationController* navController = self.navigationController; 

int count = [navController.viewControllers count]; 

NSMutableArray* controllers = [[NSMutableArray alloc] initWithCapacity:count]; 

for (int i=0; i<count; i++) { 
    if (self == [self.navigationController.viewControllers objectAtIndex:i]) { 
    [controllers addObject:newController]; 
    } 
    else { 
    [controllers addObject:[self.navigationController.viewControllers objectAtIndex:i]]; 
    } 

} 
[self.navigationController setViewControllers:controllers animated:YES]; 
[controllers release]; 

Répondre

1

Je ne comprends vraiment pas ce que vous faites là. Quelque chose comme ça ne marchera pas?

- (void)displayMyErrorVC { 
    MyErrorVC *errorVC = [[[MyErrorVC alloc] init] autorelease];   
    [self.navigationController pushViewController:errorVC animated:YES]; 
} 

Et puis dans l'autre fil, si vous avez une erreur:

[self performSelectorOnMainThread:@selector(displayMyErrorVC) withObject:nil waitUntilDone:NO]; 
+1

J'ai essayé ce que vous suggérez aussi bien avec le même résultat. Comme je l'ai mentionné, cela fonctionne très bien à partir de l'interface utilisateur mais l'un ou l'autre de nos cas échoue à partir du rappel qui n'a aucun sens parce que la poussée se passe sur le thread principal. Une autre note. Il semble que ce soit un problème beaucoup moins courant si je mets Animated à NO. Je crois vraiment qu'il doit y avoir une sorte de problème de synchronisation sur le rendu. Par exemple, si je pousse 2 contrôleurs plutôt que 1, ils apparaissent. C'est juste extrêmement étrange. Appréciez toutes les pensées supplémentaires si vous en avez –

Questions connexes