Как проверить, нажат ли контроллер навигации или является контроллером корневого представления?

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

Ответ 1

[self.navigationController viewControllers];

вернет массив всех viewControllers в стеке. Просто сравните первый элемент в этом массиве, чтобы увидеть, является ли контроллер корнем или нет.

например.

UIViewController *vc = [[self.navigationController viewControllers] firstObject];

if([vc isEqual: <viewController to check> ])
{
    // code here
}

EDIT: Добавить Swift

let vc = self.navigationController?.viewControllers.first
if vc == self.navigationController?.visibleViewController {
    //Code Here
}

Ответ 2

Всякий раз, когда вы нажимаете любой контроллер вида с помощью контроллера навигации, он управляет этими контроллерами представлений в стеке, который поддерживается в режиме Last In First Out. Поэтому, если ваш текущий контроллер представления является корневым контроллером, то в стек может быть только один объект. Вы можете проверить этот стек через этот код

if([self.navigationController.viewControllers count] == 1)  {  
   //Current view controller is root controller  
}

Ответ 3

в вашем текущем представлении диспетчера ViewDidLoad просто проверьте self.navigationController.viewControllers.count == 1 означает, что вы в настоящее время находитесь в корневом каталоге вашей навигационной системы. убедитесь, что у вас нет viewcontroller.

if(self.navigationController.viewControllers.count == 1)
{
    //do what you want
}

Ответ 4

Что касается ответа @Simon, я добавляю свой ответ, чтобы проверить, когда вы используете меню ящиков, это может помочь вам найти точную проверку контроллера корневого представления.

- (BOOL) checkImRoot:(id)controller {
    if(self.window.rootViewController) {
        if(self.window.rootViewController == (UIViewController *)controller) {
            return YES;
        }
    }
    return NO;
}

В качестве примера, я добавляю этот метод в файл делегата приложения и вызываю его, как это, чтобы проверить,

if([[AppDelegate shareDelegate] checkImRoot:self]) {
     //Yeah, I'm a root vc
}else{
     //Noo, I'm a child vc
}