1、思路
通過(guò)最底層的ViewController依次向上尋找,直到找到最頂層的ViewController役电,也就是從UIApplication的keyWindow的rootViewController開(kāi)始尋找(如果有多個(gè)UIWindow則要考慮UIWindow的選擇問(wèn)題赡艰。
在尋找的過(guò)程中,要分別考慮當(dāng)前ViewController是UITabBarController和UINavigationController的情況理张,同時(shí)還要考慮到當(dāng)前ViewController是否通過(guò)presentViewController:animated:completion:模態(tài)展示了其他ViewController
2、實(shí)現(xiàn)代碼
- (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;
}