Je veux revenir à la troisième vue de la pile de navigation et revenir à la première vue.
Je sais comment afficher une vue à la fois:
[self.navigationController popViewControllerAnimated:YES];
Mais comment faire deux à la fois?
Je veux revenir à la troisième vue de la pile de navigation et revenir à la première vue.
Je sais comment afficher une vue à la fois:
[self.navigationController popViewControllerAnimated:YES];
Mais comment faire deux à la fois?
Réponses:
Vous pouvez également essayer ceci pour sauter entre la pile du contrôleur de navigation
NSMutableArray *allViewControllers = [NSMutableArray arrayWithArray:[self.navigationController viewControllers]];
for (UIViewController *aViewController in allViewControllers) {
if ([aViewController isKindOfClass:[RequiredViewController class]]) {
[self.navigationController popToViewController:aViewController animated:NO];
}
}
Voici deux UINavigationController
extensions qui peuvent résoudre votre problème. Je recommanderais d'utiliser le premier qui apparaît dans une UIViewController
classe spécifique:
extension UINavigationController {
func popToViewController(ofClass: AnyClass, animated: Bool = true) {
if let vc = viewControllers.filter({$0.isKind(of: ofClass)}).last {
popToViewController(vc, animated: animated)
}
}
func popViewControllers(viewsToPop: Int, animated: Bool = true) {
if viewControllers.count > viewsToPop {
let vc = viewControllers[viewControllers.count - viewsToPop - 1]
popToViewController(vc, animated: animated)
}
}
}
et utilisez-le comme ceci:
// pop to SomeViewController class
navigationController?.popToViewController(ofClass: SomeViewController.self)
// pop 2 view controllers
navigationController?.popViewControllers(viewsToPop: 2)
removeLast
par juste removeLast(2)
.
let vc = viewControllers[viewControllers.count - viewsToPop + 1]
, afin de fonctionner correctement, vous devez le remplacer par: let vc = viewControllers[viewControllers.count - (viewsToPop + 1)]
oulet vc = viewControllers[viewControllers.count - viewsToPop - 1]
Vous pouvez accéder au contrôleur de vue «racine» (premier) avec popToRootViewControllerAnimated
:
[self.navigationController popToRootViewControllerAnimated:YES];
// If you want to know what view controllers were popd:
// NSArray *popdViewControllers = [self.navigationController popToRootViewControllerAnimated:YES];
UINavigationController
Référence :
Ouvre tous les contrôleurs de vue de la pile à l'exception du contrôleur de vue racine et met à jour l'affichage.
Valeur de retour
Un tableau de contrôleurs de vue qui sont extraits de la pile.
Swift 2 - xCode 7.3
Cela pourrait être une extension très utile pour pop UIViewControllers:
extension UINavigationController {
func popToViewControllerOfType(classForCoder: AnyClass) {
for controller in viewControllers {
if controller.classForCoder == classForCoder {
popToViewController(controller, animated: true)
break
}
}
}
func popViewControllers(controllersToPop: Int, animated: Bool) {
if viewControllers.count > controllersToPop {
popToViewController(viewControllers[viewControllers.count - (controllersToPop + 1)], animated: animated)
} else {
print("Trying to pop \(controllersToPop) view controllers but navigation controller contains only \(viewControllers.count) controllers in stack")
}
}
}
Si vous voulez juste afficher 2 à la fois parce que votre rootViewController est (beaucoup) `` plus profond '', alors 2 vous pouvez envisager d'ajouter une catégorie à UIviewController par exemple:
#import <UIKit/UIKit.h>
@interface UINavigationController (popTwice)
- (void) popTwoViewControllersAnimated:(BOOL)animated;
@end
#import "UINavigationController+popTwice.h"
@implementation UINavigationController (popTwice)
- (void) popTwoViewControllersAnimated:(BOOL)animated{
[self popViewControllerAnimated:NO];
[self popViewControllerAnimated:animated];
}
@end
Importez la catégorie #import "UINavigationController+popTwice.h"
quelque part dans votre implémentation et utilisez cette ligne de code pour afficher 2 contrôleurs à la fois:
[self.navigationController popTwoViewControllersAnimated:YES];
n'est-ce pas génial? :)
Swift 4:
func popViewControllerss(popViews: Int, animated: Bool = true) {
if self.navigationController!.viewControllers.count > popViews
{
let vc = self.navigationController!.viewControllers[self.navigationController!.viewControllers.count - popViews - 1]
self.navigationController?.popToViewController(vc, animated: animated)
}
}
Ensuite, utilisez cette méthode
self.popViewControllerss(popViews: 2)
//viewIndex = 1;
//viewIndex = 2;
//viewIndex = 3;
// **[viewControllers objectAtIndex: *put here your viewindex number*]
NSArray *viewControllers = [self.navigationController viewControllers];
[self.navigationController popToViewController:[viewControllers objectAtIndex:viewIndex] animated:NO];
NSMutableArray *newStack = [NSMutableArray arrayWithArray:[self.navigationController viewControllers]];
[newStack removeLastObject];
[newStack removeLastObject];
[self.navigationController setViewControllers:newStack animated:YES];
Dans Swift 3 , vous pouvez afficher un, deux ou plusieurs contrôleurs de vue à partir du contrôleur de navigation comme ça
let viewControllers = self.navigationController!.viewControllers as [UIViewController]
for aViewController:UIViewController in viewControllers {
if aViewController.isKind(of: FromWhereYouWantToGoController.self) {
_ = self.navigationController?.popToViewController(aViewController, animated: true)
}
}
Ici FromWhereYouWantToGoController est le contrôleur de destination. J'espère que ça aide.
Je n'ai pas vu cette réponse ici. Si vous ne voulez en afficher que quelques-uns (pas jusqu'à la racine), vous pouvez simplement parcourir self.navigationController.viewControllers en vérifiant les types de classe, ou si vous avez une référence, utilisez cela:
for (UIViewController *aViewController in self.navigationController.viewControllers) {
if ([aViewController isKindOfClass:[SMThumbnailViewController class]]) {
[self.navigationController popToViewController:aViewController animated:YES];
}
}
Voici une petite fonction que j'utilise pour revenir en arrière sur X ViewControllers:
-(void)backMultiple:(id)data {
int back = 2; //Default to go back 2
int count = [self.navigationController.viewControllers count];
if(data[@"count"]) back = [data[@"count"] intValue];
//If we want to go back more than those that actually exist, just go to the root
if(back+1 > count) {
[self.navigationController popToRootViewControllerAnimated:YES];
}
//Otherwise go back X ViewControllers
else {
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:count-(back+1)] animated:YES];
}
}
Version Swift à partir de (Swift 1.2 / Xcode 6.3.1) de popping deux fois ou plus
var viewControllers = self.navigationController?.viewControllers
viewControllers?.removeLast()
viewControllers?.removeLast()
self.navigationController?.setViewControllers(viewControllers, animated: true)
ou
var viewControllers = self.navigationController?.viewControllers
var viewsToPop = 2
var end = (viewControllers?.count)!
var start = end - viewsToPop
viewControllers?.removeRange(Range<Int>(start: start, end: end))
self.navigationController?.setViewControllers(viewControllers, animated: true)
Vous pouvez utiliser la pile des UIViewControllers. 1. Récupérez le tableau de tous les viewControllers de la pile. 2. Parcourez tout le tableau et trouvez le viewController souhaité en faisant
correspondre le type de classe. 3. Ouvrez le viewController.
func popToSpecificViewC
{
let viewControllers: [UIViewController] = self.navigationController!.viewControllers as [UIViewController];
for viewController:UIViewController in viewControllers
{
if viewController.isKind(of: WelcomeViewC.self)
{
_ = self.navigationController?.popToViewController(viewController, animated: true)
}
}
}
En utilisant une simple extension UINavigationController :
extension UINavigationController {
func popViewControllers(_ count: Int) {
guard viewControllers.count > count else { return }
popToViewController(viewControllers[viewControllers.count - count - 1], animated: true)
}
}