在Appdelegate中以编程方式检查哪个viewController在IPhone应用程序中运行

时间:2012-11-26 07:07:27

标签: iphone objective-c

是否有可能在Appdelegate中以编程方式检查哪个viewController在iPhone应用程序中运行

4 个答案:

答案 0 :(得分:2)

对此没有简单的答案。您需要从主窗口的根视图控制器开始遍历视图控制器层次结构。如果您遇到UINavigationController,则需要查看topViewController。到达UIViewController后,您需要查看modalViewController,如果有的话。如果您有任何标签栏控制器,则需要查看当前选定的选项卡。

UISplitViewController之类的东西使事情变得复杂,因为这可以同时显示两个视图控制器。

以下是您可以添加到UIViewController的类别方法的开头。这只处理常规视图控制器和导航控制器。

- (UIViewController *)topMostController {
    if (self.modalViewController) {
        return [self.modalViewController topMostController];
    } else {
        if ([self isKindOfClass:[UINavigationController class]]) {
            UINavigationController *nc = (UINavigationController *)self;

            return [nc.topViewController topMostController];
        } else {
            return self;
        }
    }
}

在关键窗口的rootViewController

上,从您的应用代表处拨打此电话

答案 1 :(得分:1)

假设您已在AppDelegate中设置了rootViewController属性:

[UIApplication sharedApplication].keyWindow.rootViewController;

答案 2 :(得分:1)

对于视图控制器,无法获取正在运行的viewcontroller名称。

为此您在app delegate file&中编写了以下一种方法:然后在每个viewcontroller视图中调用getCurentViewController方法,如果你没有通过将self传递给它来分配agin,那么确实会出现加载或视图

-(void) getCurentViewController:(UIViewController*) vc
{
      if([vc isMemberOfClass:NSClassFromString(@"vcName")])
      {
          //write your code here
      }
      else if([vc isMemberOfClass:NSClassFromString(@"vcName1")])
      {  
         //write your code here
      }

 }

答案 3 :(得分:1)

UIViewController *currentViewController = yourRootViewController;
while (currentViewController.presentedViewController) {
    currentViewController = currentViewController.presentedViewController;
}
//currentViewController is now your top-most viewController
//I use this same snippet in my production code