从 root view controller 开始递归遍历所有的控制器,如果摸到的控制器是 UITabBarController 的子类,就找它的selectedViewController
继续向递归,如果摸到的控制器是 UINavigationController 的子类,就找它的visibleViewController
继续递归。这样一路找上来,总会到头,最头上的控制器就是我们的目标控制器。
@implementation UIApplication (ActivityViewController)
- (UIViewController *)activityViewController {
__block UIWindow *normalWindow = [self.delegate window];
if (normalWindow.windowLevel != UIWindowLevelNormal) {
[self.windows enumerateObjectsUsingBlock:^(__kindof UIWindow * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if (obj.windowLevel == UIWindowLevelNormal) {
normalWindow = obj;
*stop = YES;
}
}];
}
return [self p_nextTopForViewController:normalWindow.rootViewController];
}
- (UIViewController *)p_nextTopForViewController:(UIViewController *)inViewController {
while (inViewController.presentedViewController) {
inViewController = inViewController.presentedViewController;
}
if ([inViewController isKindOfClass:[UITabBarController class]]) {
UIViewController *selectedVC = [self p_nextTopForViewController:((UITabBarController *)inViewController).selectedViewController];
return selectedVC;
} else if ([inViewController isKindOfClass:[UINavigationController class]]) {
UIViewController *selectedVC = [self p_nextTopForViewController:((UINavigationController *)inViewController).visibleViewController];
return selectedVC;
} else {
return inViewController;
}
}
@end
在需要的时候直接使用[[UIApplication sharedApplication] activityViewController]
就可以返回最上层的 view controller
转自:http://www.jianshu.com/p/07eddb813659