如何检查导航控制器是否被按下或是否为根视图控制器?

时间:2014-12-09 11:38:21

标签: ios objective-c push navigationcontroller

我想检查我所在的视图控制器是否是根视图控制器,或是在某个导航控制器上推送。

4 个答案:

答案 0 :(得分:13)

[self.navigationController viewControllers];

将返回堆栈中所有viewControllers的数组。只需比较这个数组中的第一个元素,看看控制器是否为root。

e.g。

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

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

编辑:添加Swift

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

答案 1 :(得分:9)

每当您通过导航控制器推送任何视图控制器时,它都会在堆栈中管理这些视图控制器,该控制器以后进先出方式维护。因此,如果您当前的视图控制器是根控制器,那么堆栈中只能有一个对象。您可以通过此代码检查该堆栈

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

答案 2 :(得分:4)

在当前View控制器的viewDidLoad中,只需检查self.navigationController.viewControllers.count == 1即表示您当前处于导航堆栈的rootview中。确保你没有出现viewcontroller。

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

答案 3 :(得分:2)

关于@Simon回答,我正在添加我的答案,检查你何时使用抽屉菜单,这可以帮助你找到准确的根视图控制器检查。

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

在示例中,我在app委托文件中添加此方法,并调用它来检查,

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