我想检查我所在的视图控制器是否是根视图控制器,或是在某个导航控制器上推送。
答案 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
}