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

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

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

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

Ответы [ 17 ]

106 голосов
/ 10 августа 2011

Вы можете использовать свойство UINavigationController viewControllers:

@property(nonatomic, copy) NSArray *viewControllers

Обсуждение: контроллер корневого представления имеет индекс 0 в массиве,контроллер заднего вида имеет индекс n-2, а верхний контроллер - индекс n-1, где n - количество элементов в массиве.

https://developer.apple.com/documentation/uikit/uinavigationcontroller

Вы можете использовать это, чтобы проверить, является ли корневой контроллер представления (тот, что с индексом массива 0) контроллером представления A или B.

102 голосов
/ 05 июля 2013

Вот реализация принятого ответа:

- (UIViewController *)backViewController
{
    NSInteger numberOfViewControllers = self.navigationController.viewControllers.count;

    if (numberOfViewControllers < 2)
        return nil;
    else
        return [self.navigationController.viewControllers objectAtIndex:numberOfViewControllers - 2];
}
28 голосов
/ 19 ноября 2013
- (UIViewController *)backViewController
{
    NSInteger myIndex = [self.navigationController.viewControllers indexOfObject:self];

    if ( myIndex != 0 && myIndex != NSNotFound ) {
        return [self.navigationController.viewControllers objectAtIndex:myIndex-1];
    } else {
        return nil;
    }
}
11 голосов
/ 15 октября 2013

Более общая реализация принятого ответа:

- (UIViewController *)backViewController {
    NSArray * stack = self.navigationController.viewControllers;

    for (int i=stack.count-1; i > 0; --i)
        if (stack[i] == self)
            return stack[i-1];

    return nil;
}

Это вернет правильный "контроллер вида сзади" независимо от того, где текущий класс находится в стеке навигации.

9 голосов
/ 25 ноября 2015

Быстрая реализация кода tjklemz в качестве расширения:

extension UIViewController {

    func backViewController() -> UIViewController? {        
        if let stack = self.navigationController?.viewControllers {
            for(var i=stack.count-1;i>0;--i) {
                if(stack[i] == self) {
                    return stack[i-1]
                }
            }
        }
        return nil
    }
}
9 голосов
/ 28 мая 2016

Вот модифицированная версия кода Прабху Бимана Swift, который адаптирует его для поддержки Swift 3:

extension UIViewController {
    func backViewController() -> UIViewController? {
        if let stack = self.navigationController?.viewControllers {
            for i in (1..<stack.count).reverse() {
                if(stack[i] == self) {
                    return stack[i-1]
                }
            }
        }
        return nil
    }
}
3 голосов
/ 08 июля 2016

Как расширение UINavigationController:

extension UINavigationController {

    func previousViewController() -> UIViewController? {
        guard viewControllers.count > 1 else {
            return nil
        }
        return viewControllers[viewControllers.count - 2]
    }

}
3 голосов
/ 10 августа 2011

Доступ к элементу n-2 свойства viewControllers для доступа к родительскому контроллеру представления.

Получив этот экземпляр, вы можете проверить его тип, зарегистрировав, что выходитфункции NSStringFromClass().Или вы можете сохранить некоторую строку идентификатора static const в контроллерах A и B и функцию получения, которая выводит строку.

2 голосов
/ 28 марта 2015

Быстрая реализация кода @tjklemz:

var backViewController : UIViewController? {

        var stack = self.navigationController!.viewControllers as Array

        for (var i = stack.count-1 ; i > 0; --i) {
            if (stack[i] as UIViewController == self) {
                return stack[i-1] as? UIViewController
            }

        }
        return nil
    }
1 голос
/ 10 августа 2011

Используйте метод navigationController, чтобы получить его. См. документацию на сайте Apple .

navigationController Родитель или предок, который является навигацией контроллер. (Только для чтения)

@ свойство (неатомное, только для чтения, сохранить) UINavigationController * NavigationController

Обсуждение Возвращает контроллер навигации только если вид контроллер находится в своем стеке. Это свойство равно нулю, если навигация контроллер не найден.

Доступность Доступно в iOS 2.0 и более поздних версиях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...