iOS-Developer-OC

iOS 获取当前显示的控制器

2016-11-22  本文已影响751人  August24

iOS OC 获得当前显示的控制器


我观察到点击mac版微信启动页面中的登录按钮时,手机端的微信都会present出一个确认页面。细致研究时会发现如果手机端当前停留的页面是被present出来的话,此时是不会弹出确认页面的。

今天我们讨论一下,如何获取当前显示的控制器。

mac微信启动页面
+ (UIViewController *)topController {
    
    UIViewController *topC = [self topViewController:[[UIApplication sharedApplication].keyWindow rootViewController]];
    while (topC.presentedViewController) {
        topC = [self topViewController:topC.presentedViewController];
    }
    return topC;
}

+ (UIViewController *)topViewController:(UIViewController *)controller {
    if ([controller isKindOfClass:[UINavigationController class]]) {
        return [self topViewController:[(UINavigationController *)controller topViewController]];
    } else if ([controller isKindOfClass:[UITabBarController class]]) {
        return [self topViewController:[(UITabBarController *)controller selectedViewController]];
    } else {
        return controller;
    }
}

大体思路是获取到window的rootViewController 之后开始递归调用(UIViewController *)topViewController:(UIViewController *)controller这个方法,直到传入的控制不再是容器类控制器后返回。返回之后会检查处理present 这种情况。

效果

项目代码已经上传github 项目地址

上一篇 下一篇

猜你喜欢

热点阅读