2009-09-28 6 views
2

J'ai un UIView ajouté dans la fenêtre principale avec un contrôleur. En cliquant sur un bouton de cette vue, je veux charger un UINavigationController qui migrera vers plusieurs vues en les poussant un par un sur la pile. Maintenant ce que je veux faire est quand l'utilisateur atteint à la fin des vues, dans la dernière vue j'ai un bouton fait. En cliquant sur ce bouton, je veux revenir à mon premier écran déchargeant le NavigationController de la mémoire.Comment supprimer toute la vue avec rootView de UINavigationController dans l'iPhone

Quelle est la meilleure façon de le faire puisque popToRootViewController vous amène au premier écran de UINavigationController qui est mon deuxième écran.

Répondre

1

Vous voulez essentiellement supprimer la vue des contrôleurs de navigation, alors pourquoi ne pas simplement dire [navigationController.view removeFromSuperView]?

+0

Sera-t libérer la mémoire et toutes les vues mises en cache par le NavigationController – rkb

+0

removeFromSUperView coutume, mais vous pouvez le libérer après cela et il le fera. – Daniel

+0

Si la vue principale est la seule chose qui retienne le contrôleur de navigation, alors removeFromSuperView le relâchera réellement (et tout ce qu'il retiendra récursivement). – Tyler

0

Une façon de le faire est de présenter le contrôleur de navigation en tant que contrôleur de vue modal, et la rejeter lorsque vous avez terminé:

// In the parent controller, when the navigation controller is about to appear: 
UINavigationController* navController = [[UINavigationController alloc] init]; 
[self presentModalViewController:navController animated:YES]; 

// ... later, in the nav controller, when it's done being used: 
[self.parentViewController dismissModalViewControllerAnimated:YES]; 
[self autorelease]; // goodbye, cruel world (when the ar pool is drained) 
+0

non Vue modale Le contrôleur couvre le tabBar en bas. – rkb

+1

Une vue modale couvre la barre d'onglets pour une bonne raison, pour forcer l'utilisateur à compléter les vues et à éliminer la confusion. Considérez la possibilité que vous deviez repenser votre interface utilisateur au lieu de combattre les conventions d'UIKit (cela peut être plus facile). –

0

Quelques idées, afin de désirabilité

  1. fait du contrôleur n ° 1 le contrôleur de la vue racine de la pile, puis utilise popToRootViewController. Y a-t-il une bonne raison pour laquelle vous ne le faites pas déjà? Gardez à l'esprit que vous pouvez facilement cacher la barre de navigation de n'importe quel contrôleur, si c'est ce que vous craignez. Ajoutez une méthode appelée «destroyNavigationStack» ou quelque chose au contrôleur principal n ° 1 et faites référence au contrôleur n ° 1 dans votre délégué d'application. Dans votre contrôleur Nth view, lorsque "done" est atteint, obtenez une référence à votre délégué d'application (méthode sharedApplication de UIApplication) et envoyez à View Controller n ° 1 ce message "destroy". Il n'y a vraiment aucune raison de penser même à faire sauter les contrôleurs de vue de la pile puisque vous voulez juste vous débarrasser de toute la pile de toute façon.

  2. Faire ViewController # 1 un singleton et appelez destroyNavigationStack

+0

Theres pas besoin de faire un viewcontroller un singleton ... – Daniel

+1

option 1 ici est vraiment la meilleure solution pour le problème. La première vue devrait être la vue racine du contrôleur de navigation, et il n'y a aucune raison de penser à pourquoi vous ne voudriez pas faire cela. –

+0

corey convenu. s – Daniel

Questions connexes