0

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

4

4 回答 4

2

对此没有简单的答案。您需要从主窗口的根视图控制器开始遍历视图控制器层次结构。如果遇到 aUINavigationController需要查看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.

于 2012-11-26T07:31:55.817 回答
1

假设您已在以下位置设置了 rootViewController 属性AppDelegate

[UIApplication sharedApplication].keyWindow.rootViewController;
于 2012-11-26T07:12:56.457 回答
1

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

为此,您在应用程序委托文件中编写了一个以下方法,然后在每个视图控制器视图中调用 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
      }

 }
于 2012-11-26T07:30:36.923 回答
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
于 2012-11-26T08:08:52.990 回答