Как идентифицировать предыдущий контроллер представления в стеке навигации - PullRequest
77 голосов
/ 10 августа 2011

У меня есть 2 отдельных navigationcontrollers, один с RootViewController A, а другой с RootViewController B.

Я могу нажать ViewController C на стек навигации A или B.

Вопрос: Когда я нахожусь в ViewController C, как я могу узнать, нахожусь ли я в стеке, принадлежащем A или B?

Ответы [ 17 ]

1 голос
/ 20 октября 2015

Потому что мертвым лошадям нравится быть избитыми:)

- (UIViewController *)previousViewController
{
    NSArray *vcStack = self.navigationController.viewControllers;
    NSInteger selfIdx = [vcStack indexOfObject:self];
    if (vcStack.count < 2 || selfIdx == NSNotFound) { return nil; }
    return (UIViewController *)[vcStack objectAtIndex:selfIdx - 1];
}
0 голосов
/ 23 августа 2017

Более лаконичная импровизация Свифта:

extension UIViewController {
    var previousViewController: UIViewController? {
        guard let nav = self.navigationController,
              let myIdx = nav.viewControllers.index(of: self) else {
            return nil
        }
        return myIdx == 0 ? nil : nav.viewControllers[myIdx-1]
    }
}
0 голосов
/ 21 февраля 2017

для быстрой 3 вы можете сделать это:

var backtoViewController:UIViewController!
for viewController in (self.navigationController?.viewControllers)!.reversed() {
    if viewController is NameOfMyDestinationViewController {
            backtoViewController = viewController
    }
}
self.navigationController!.popToViewController(backtoViewController, animated: true)

Вам нужно только заменить «NameOfMyDestinationViewController» на viewController, который вы хотите вернуть.

0 голосов
/ 02 октября 2016

Мое расширение, быстрое 3

extension UIViewController {
    var previousViewController: UIViewController? {
        guard let controllers = navigationController?.viewControllers, controllers.count > 1 else { return nil }
        switch controllers.count {
        case 2: return controllers.first
        default: return controllers.dropLast(2).first
        }
    }
}
0 голосов
/ 27 мая 2015

Найти предыдущий вид контроллера просто.

В вашем случае, т.е. вы находитесь в C и вам нужен B, [self.navigationController.viewControllers lastObject] - это то, что вы хотите.

Для A, так как A является корневым контроллером представления, вы можете просто заменить lastObject на firstObject, чтобы получить.

0 голосов
/ 02 июня 2016

Со Свифтом, использующим охрану.

extension UIViewController {

    func getPreviousViewController() -> UIViewController? {
        guard let _ = self.navigationController else {
            return nil
        }

        guard let viewControllers = self.navigationController?.viewControllers else {
            return nil
        }

        guard viewControllers.count >= 2 else {
            return nil
        }        
        return viewControllers[viewControllers.count - 2]
    }
}
0 голосов
/ 18 апреля 2016

Реализация для Swift 2.2 - Добавьте это в расширение UIViewController. Безопасный в том смысле, что он вернет nil, если viewcontroller является rootvc или нет в навигационном контроллере.

var previousViewController: UIViewController? {
  guard let viewControllers = navigationController?.viewControllers else {
    return nil
  }
  var previous: UIViewController?
  for vc in viewControllers{
    if vc == self {
      break
    }
    previous = vc
  }
  return previous
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...