2011-08-22 4 views
0

J'ai 3 viewControllers A, B et C.iPhone - viewController appelant viewController

Je suis sur Vca et je pousse VCB à l'aide

[self.navigationController pushViewController:vcB animated:YES]; 

Alors que VCB est visible, je pousse des CBV.

Maintenant, je suis à l'intérieur de vcC et je voudrais supprimer (ou pop) à la fois vcC et vcB en même temps et aller directement à vcA. Je ne veux pas aller à vcB. Comment je fais ça?

Est-il possible d'enlever vcB de la pile silencieusement pendant que vcC est affiché?

grâce

Répondre

2

Je pense que vous pouvez jouer avec eux comme un tableau

NSMutableArray *viewControllers = [NSMutableArray arrayWithArray: navigationController.viewControllers]; 
[viewControllers removeObjectIdenticalTo: removedViewController]; 
navigationController.viewControllers = viewControllers; 
+0

Yesssssssssssssssssssssssssssssssssssssssssss !!!!!!!!!!!!!!! C'est tout! Merci!!!!! – SpaceDog

+0

Savons-nous si cela respecte le cycle de gestion de la vie? Comme dans, les vues supprimées obtiennent-elles tous leurs rappels de déchargement tiggered? –

+0

Étant donné que vous continuez à référencer les valeurs réelles et que vous créez simplement un tableau Mutable et supprimez une seule valeur, tout devrait fonctionner. Cependant, le retirer de ce tableau peut laisser une retenue sur lui. Je vérifierais que tout fonctionne correctement en s'attachant aux instruments et en effectuant la fonction encore et encore. Et si vous avez des fuites de mémoire sur cette action, alors je libérerais l'élément retiré du tableau de cette façon. Autre alors que cela devrait fonctionner normalement. –

2

Avez-vous essayé:

[self.navigationController popToRootViewControllerAnimated:YES]; 
+0

oui, cela supprime vcC mais pas vcB. – SpaceDog

0

Vous pouvez simplement appeler -popToRootViewControllerAnimated: sur votre UINavigationController ...

[self.navigationController popToRootViewControllerAnimated:YES];

0

Si A est la racine, popToRootViewController.

Sinon, en supposant que vous gardez aux restrictions d'Apple sur l'utilisation des API non documentée, je vous suggère que non, vous ne pouvez pas sauter les deux C ans B de la liste de C.

Toute manipulation directe de la pile de vue Votre meilleur pari serait de définir un drapeau global de C, pop-it, et dans B's viewWillAppear (apparaîtra, non DID apparaître), vous vérifiez pour l'état de ledit drapeau, et s'il est activé, immédiatement pop à A.

La vue B n'apparaîtra pas, et au pire provoquera une petite, probablement imper lag ceptible entre C et A.

+0

merci. Apparemment, vous pouvez pirater la pile officiellement, en utilisant la réponse de Jason. Merci quand même. – SpaceDog

2

Si vous savez que A est toujours le premier contrôleur que vous poussez, alors vous devriez être en mesure de le faire:

[self.navigationController popToRootViewControllerAnimated:YES]

Ou s'il peut y avoir d'autres contrôleurs sur la pile avant A, vous pouvez le faire:

[self.navigationController popToViewController:viewControllerA animated:YES]

References.

+0

Comment astucieux, en quelque sorte jamais remarqué cette méthode. –

+0

Comment prendriez-vous soin du cas lorsque l'utilisateur appuie sur le bouton de retour? Il n'y a pas de moyen facile d'y placer un crochet. – Akshay

Questions connexes