获取当前最顶层的ViewController

最近学会了一个小小的黑科技,用于获取当前最顶层的ViewController
原理是通过最底层的ViewController依次向上寻找,直到找到最顶层的ViewController,也就是从UIApplication的keyWindow的rootViewController开始寻找(如果有多个UIWindow则要考虑UIWindow的选择问题)

在寻找的过程中,要分别考虑当前ViewController是UITabBarController和UINavigationController的情况,同时还要考虑到当前ViewController是否通过 presentViewController:animated:completion: 模态展示了其他ViewController。

代码如下

- (UIViewController *)topViewController { 
  UIViewController *resultVC;
  resultVC = [self _topViewController:[[UIApplication sharedApplication].keyWindow rootViewController]]; 
  while (resultVC.presentedViewController) { 
    resultVC = [self _topViewController:resultVC.presentedViewController]; 
  }
   return resultVC;
}

- (UIViewController *)_topViewController:(UIViewController *)vc { 
  if ([vc isKindOfClass:[UINavigationController class]]) { 
    return [self _topViewController:[(UINavigationController *)vc topViewController]]; 
  }else if ([vc isKindOfClass:[UITabBarController class]]) {
     return [self _topViewController:[(UITabBarController *)vc selectedViewController]]; 
  } else {
     return vc;
  }
 return nil;
}

使用方法

UIViewController *topmostVC = [self topViewController];

你可能感兴趣的:(获取当前最顶层的ViewController)