Как получить два представления одновременно с контроллера навигации? - PullRequest
83 голосов
/ 23 ноября 2011

Я хочу, чтобы перейти к третьему представлению в стеке навигации обратно к первому представлению.

Я знаю, как отобразить одно представление одновременно:

[self.navigationController popViewControllerAnimated:YES];

Но как мнесделать два сразу?

Спасибо ...

Ответы [ 18 ]

127 голосов
/ 11 июня 2012

Вы можете попробовать это также для перехода между стеком навигационного контроллера

NSMutableArray *allViewControllers = [NSMutableArray arrayWithArray:[self.navigationController viewControllers]];
for (UIViewController *aViewController in allViewControllers) {
    if ([aViewController isKindOfClass:[RequiredViewController class]]) {
        [self.navigationController popToViewController:aViewController animated:NO];
    }
}
56 голосов
/ 14 мая 2014

Вот два UINavigationController расширения, которые могут решить вашу проблему. Я бы порекомендовал использовать первый, который появляется на UIViewController определенного класса:

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)
    }
  }

}

и используйте его так:

// pop to SomeViewController class
navigationController?.popToViewController(ofClass: SomeViewController.self)

// pop 2 view controllers
navigationController?.popViewControllers(viewsToPop: 2)
43 голосов
/ 23 ноября 2011

Вы можете получить доступ к «первому» (первому) контроллеру вида с помощью popToRootViewControllerAnimated:

[self.navigationController popToRootViewControllerAnimated:YES];

// If you want to know what view controllers were popd:
// NSArray *popdViewControllers = [self.navigationController popToRootViewControllerAnimated:YES];

UINavigationController Ссылка :

Выдвигает все контроллеры представления в стеке, кроме корневого контроллера представления, и обновляет отображение.

Возвращаемое значение
Массив контроллеров представления, извлеченных из стека.

29 голосов
/ 16 апреля 2013
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];   

objectAtIndex: 1 -> вы можете передать любой индекс, который вы хотите добавить в

18 голосов
/ 01 июля 2016

Swift 2 - xCode 7.3

Это может быть очень полезным расширением для поп-контроллеров 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")
        }
    }
}
15 голосов
/ 10 января 2012

Если вы просто хотите открыть 2 сразу, потому что ваш rootViewController (путь) «глубже», то 2 вы можете рассмотреть возможность добавления категории в UIviewController, например:

UINavigationController + popTwice.h

#import <UIKit/UIKit.h>
@interface UINavigationController (popTwice)

- (void) popTwoViewControllersAnimated:(BOOL)animated;

@end

UINavigationController + popTwice.m

#import "UINavigationController+popTwice.h"

@implementation UINavigationController (popTwice)

- (void) popTwoViewControllersAnimated:(BOOL)animated{
    [self popViewControllerAnimated:NO];
    [self popViewControllerAnimated:animated];
}

@end

Импортируйте категорию #import "UINavigationController+popTwice.h" где-нибудь в вашей реализации и используйте эту строку кода для одновременной установки двух контроллеров:

[self.navigationController popTwoViewControllersAnimated:YES];

разве это не здорово?:)

6 голосов
/ 20 ноября 2013
//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];
6 голосов
/ 23 ноября 2011

Вы также можете попробовать это: -

[self.navigationController popToViewController:yourViewController animated:YES];
4 голосов
/ 02 ноября 2017

In Swift 3 , Вы можете получить один, два или более контроллеров представления из контроллера навигации, как это

let viewControllers = self.navigationController!.viewControllers as [UIViewController]
    for aViewController:UIViewController in viewControllers {
        if aViewController.isKind(of: FromWhereYouWantToGoController.self) {
            _ = self.navigationController?.popToViewController(aViewController, animated: true)
        }
    }

Здесь FromWouYouWantToGoController является контроллером назначения. Надеюсь, поможет.

4 голосов
/ 18 апреля 2013
    NSMutableArray *newStack = [NSMutableArray arrayWithArray:[self.navigationController viewControllers]];
    [newStack removeLastObject];
    [newStack removeLastObject];
    [self.navigationController setViewControllers:newStack animated:YES];
...