美文网首页
UIViewController面试相关问题整理

UIViewController面试相关问题整理

作者: oc123 | 来源:发表于2019-05-08 16:39 被阅读0次
1.如何获取当前最上层的UIViewController?

请看代码分析:

//获取当前最上层的控制器
-(UIViewController *) getTopMostController
{
    UIWindow *topWindow = [UIApplication sharedApplication].keyWindow;
    if (topWindow.windowLevel != UIWindowLevelNormal)
    {
        topWindow = [self returnWindowWithWindowLevelNormal];
    }
    
    UIViewController *topController = topWindow.rootViewController;
    if(topController == nil)
    {
        topWindow = [UIApplication sharedApplication].delegate.window;
        if (topWindow.windowLevel != UIWindowLevelNormal)
        {
            topWindow = [self returnWindowWithWindowLevelNormal];
        }
        topController = topWindow.rootViewController;
    }
    
    while(topController.presentedViewController)
    {
        topController = topController.presentedViewController;
    }
    
    if([topController isKindOfClass:[UINavigationController class]])
    {
        UINavigationController *nav = (UINavigationController*)topController;
        topController = [nav.viewControllers lastObject];
        
        while(topController.presentedViewController)
        {
            topController = topController.presentedViewController;
        }
    }
    
    return topController;
}
// 获取目标window
-(UIWindow *) returnWindowWithWindowLevelNormal
{
    NSArray *windows = [UIApplication sharedApplication].windows;
    for(UIWindow *topWindow in windows)
    {
        if (topWindow.windowLevel == UIWindowLevelNormal)
            return topWindow;
    }
    return [UIApplication sharedApplication].keyWindow;
}

先获取目标window,然后获取目标window的rootViewController,然后获取rootViewController的presentedViewController,并判断其是否是UINavigationController的子类,若不是那就取其本身,如果是那么久通过其viewControllers属性访问它lastObject来获取最上层ViewController。

相关文章

网友评论

      本文标题:UIViewController面试相关问题整理

      本文链接:https://www.haomeiwen.com/subject/nghvoqtx.html