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

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

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

[self.navigationController popViewControllerAnimated:YES];

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

Спасибо ...

Ответы [ 18 ]

4 голосов
/ 15 февраля 2019

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

Тогда используйте этот метод

self.popViewControllerss(popViews: 2)
3 голосов
/ 11 июля 2012

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

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

L.

3 голосов
/ 20 июня 2013

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

for (UIViewController *aViewController in self.navigationController.viewControllers) {
   if ([aViewController isKindOfClass:[SMThumbnailViewController class]]) {
      [self.navigationController popToViewController:aViewController animated:YES];
   }
}
2 голосов
/ 01 ноября 2012

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

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

[self.navigationController popToRootViewControllerAnimated:YES];

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

1 голос
/ 03 марта 2017

Вы можете использовать стек контроллеров 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)
            }
        }
}
1 голос
/ 05 мая 2015

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)
0 голосов
/ 17 июня 2019

Swift 4,2

На вашем navigationController?.viewControllers вы можете проверить ваши viewControllers на вашем навигационном контроллере, так что вам просто нужно выдвинуть нужную позицию, вот так:

navigationController?.popToViewController(navigationController?.viewControllers[1], animated: true)

Где 1 - позиция моего ViewController, которую я хочу открыть.

...