J'ai donc une pile de trois UITableViewControllers, chacun affichant sa vue correctement sous la barre de navigation lorsque je tape manuellement dans l'interface utilisateur.Mise en place vissée lorsque je pousse plusieurs contrôleurs sans animation
Cependant, maintenant je travaille sur la restauration de l'état à travers le redémarrage de l'application, et donc je pousse les deux mêmes contrôleurs sur le contrôleur racine, un à la fois, dans la même méthode dans le thread principal. Ce qui finit par arriver, c'est que la vue du contrôleur central est trop éloignée et que la vue du contrôleur supérieur est trop loin (sous la barre de navigation).
Code pertinent:
for (int i = 0; i < [controllerState count]-1; i++) {
MyViewController* top = (MyViewController*)navigationController.topViewController;
int key = [[controllerState objectAtIndex:i] integerValue];
[top restoreNextViewController:key]; // this calls pushViewController:
// so top will be different in the next iteration
}
Je pense que le problème est que je ne suis pas une importante permettant processus d'actualisation de l'interface utilisateur qui aura lieu entre les deux poussées, parce qu'ils se trouvent dans le même fil. Il semble presque que l'ajustement automatique de la vue qui est censé affecter le contrôleur supérieur affecte plutôt le réglage du milieu.
Est-ce exact? Et si oui, que dois-je faire, puisque je veux que toute la restauration de l'état ait lieu immédiatement après le début de l'application?
EDIT: on dirait que je n'étais pas clair. restoreNextViewController:
est une méthode de sous-classe MyViewController qui restaure l'état du contrôleur en fonction d'une clé stockée, puis pousse le contrôleur enfant approprié avec [self.navigationController pushViewController:foo animated:NO]
. Je le fais parce que mon application actuelle, contrairement à ce cas simplifié, a jusqu'à 6 contrôleurs dans la pile, et ils ne sont pas toujours les mêmes. Donc j'ai pensé que ce serait un design plus propre que de descendre la pile en contrôlant les classes des contrôleurs. Chaque contrôleur sait déjà comment pousser un contrôleur enfant en réponse à l'entrée de l'utilisateur; pourquoi ne pas réutiliser cela sur le redémarrage de l'application? Je n'ai aucun problème à faire apparaître les contrôleurs; ils sont juste disposés étrangement.
Je n'ai aucun problème à faire apparaître les contrôleurs; ils sont juste mal disposés. Voir ma question éditée. – lawrence