Как вывести сразу два вида из навигационного контроллера?

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

Я знаю, как поп один вид сразу:

[self.navigationController popViewControllerAnimated:YES];

но как мне сделать два в одном?

спасибо...

16 ответов


вы можете попробовать это, чтобы перейти между стеком навигационного контроллера, а также

NSMutableArray *allViewControllers = [NSMutableArray arrayWithArray:[self.navigationController viewControllers]];
for (UIViewController *aViewController in allViewControllers) {
    if ([aViewController isKindOfClass:[RequiredViewController class]]) {
        [self.navigationController popToViewController:aViewController animated:NO];
    }
}

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

extension UINavigationController {

  func popToViewController(ofClass: AnyClass, animated: Bool = true) {
    if let vc = viewControllers.filter({.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)

вы можете перейти к" корневому " (первому) контроллеру просмотра с popToRootViewControllerAnimated:

[self.navigationController popToRootViewControllerAnimated:YES];

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

UINavigationController ссылка:

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

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


[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];   

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


Swift 2-xCode 7.3

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

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

UINavigationController + popTwice.h

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

- (void) popTwoViewControllersAnimated:(BOOL)animated;

@end

UINavigationController + popTwice.м

#import "UINavigationController+popTwice.h"

@implementation UINavigationController (popTwice)

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

@end

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

[self.navigationController popTwoViewControllersAnimated:YES];

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


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

[self.navigationController popToViewController:yourViewController animated:YES];

//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];

В Swift 3, вы можете вытащить один, два или более viewcontrollers из навигационного контроллера, как это

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

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


вы можете передать контроллер начального вида (тот, к которому вы хотите вернуться) , а затем вызвать эту строку в последнем представлении:

[self.navigationController popToViewController:yourInitialViewController animated:YES];

л.


Я не видел этого ответа здесь. Если вы хотите только поп несколько (не до самого корня), вы можете просто повторить через себя.navigationController.viewControllers, проверяющие типы классов, или если у вас есть ссылка, используйте это:

for (UIViewController *aViewController in self.navigationController.viewControllers) {
   if ([aViewController isKindOfClass:[SMThumbnailViewController class]]) {
      [self.navigationController popToViewController:aViewController animated:YES];
   }
}

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

[self.navigationController popToRootViewControllerAnimated:YES];

или, если представление, которое вы хотите открыть, не является первым, вам нужно снова открыть viewWillAppear


вот небольшая функция, которую я использую для возврата 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];
    }
}

версия Swift с (Swift 1.2 / Xcode 6.3.1) появляются два или больше

 var viewControllers = self.navigationController?.viewControllers
 viewControllers?.removeLast()
 viewControllers?.removeLast()
 self.navigationController?.setViewControllers(viewControllers, animated: true)

или

 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)

вы можете использовать стек UIViewControllers. 1. Получать массив всех viewControllers в стеке. 2. Переберите весь массив и найдите нужный viewController
путем сопоставления типа класса. 3. Поп файле 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)
            }
        }
}