2009-05-26 3 views
3

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.

Répondre

0

J'ai fini par réinitialiser manuellement l'incrustation de contenu de chaque vue de table pendant le viewWillAppear: de son contrôleur.

0

Vous pouvez appeler pushViewController: animé: plusieurs fois. Veuillez poster le code pour -restoreNextViewController. Il est déroutant pourquoi ce code est aussi complexe que c'est. Avez-vous lu la section du Guide du contrôleur de vue sur Creating a Nav Controller? Ils couvrent le fait de pousser les contrôleurs de vue sur la pile au démarrage.

+0

Je n'ai aucun problème à faire apparaître les contrôleurs; ils sont juste mal disposés. Voir ma question éditée. – lawrence

0

Je suis d'accord avec Rob, je voudrais mettre en application UINavigationController lorsque votre application est chargée. Ensuite, vous devez pousser chacun de vos contrôleurs sur UINavigtionController dans la séquence que vous voulez qu'ils soient en couches.

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated 

Donc, si vous savez quel état vous voulez apporter votre demande de nouveau à vous pu charger le ViewController approprié dans la série à latered et les pousser sur le NavigationController.

UIViewController *myViewController = [[UIViewController alloc] initWithNibName:@"myView" bundle:nil]; 
[navigationController pushViewController:myViewController animated:NO]; 

Ensuite, si vous voulez « pop » retour à l'UIViewController soit l'utilisateur peut appuyer sur le bouton « Retour » sur navigationbar gratuitement. Ou vous pouvez contrôler la navigation avec

- (UIViewController *)popViewControllerAnimated:(BOOL)animated 

eg [[self navigationController] popViewControllerAnimated:NO]; 

Vous pouvez également contrôler si vous souhaitez que NavigationBar afficher ou non si vous souhaitez contrôler la poussée/pop-vous. J'espère que j'ai bien expliqué cela. Je viens de parcourir cette route récemment.

1

Avez-vous envisagé que chaque contrôleur de vue pousse son enfant pendant viewWillAppear:? Je voudrais juste définir une propriété isRestoringState dans votre appDelegate et vérifier que pendant viewWillAppear:, si elle est définie, exécutez votre restauration pour cette vue, y compris en poussant toute vue enfant visible. Quelque chose comme:

- (void)viewWillAppear:(BOOL)animated { 
    if ([[UIApplication sharedApplication] isRestoringState]) { 
     // restore local state, set myChildController if a child is visible 
     if (myChildController) { 
      [self.navigationController pushViewController:myChildController animated:NO]; 
     } 
    } 
} 
Questions connexes