美文网首页
保证当前Controller在最顶层

保证当前Controller在最顶层

作者: ashura_ | 来源:发表于2017-05-04 20:16 被阅读0次

    问题

    某些时候,需要随时弹出的界面在最顶层。例如:每个接口都可能返回鉴权失败,需要重新登录的登录界面或者手势解锁界面。

    解决方案

    获取到当前最顶层Controller

    #import <UIKit/UIKit.h>
    
    @(原创整理)interface UIViewController (Utils)
    
    +(UIViewController*) currentViewController;
    
    @end
    

    .m

    #import "UIViewController+Utils.h"
    
    @implementation UIViewController (Utils)
    
    +(UIViewController*) findBestViewController:(UIViewController*)vc {
    
        if (vc.presentedViewController) {
    
            // Return presented view controller
            return [UIViewController findBestViewController:vc.presentedViewController];
    
        } else if ([vc isKindOfClass:[UISplitViewController class]]) {
    
            // Return right hand side
            UISplitViewController* svc = (UISplitViewController*) vc;
            if (svc.viewControllers.count > 0)
                return [UIViewController findBestViewController:svc.viewControllers.lastObject];
            else
                return vc;
    
        } else if ([vc isKindOfClass:[UINavigationController class]]) {
    
            // Return top view
            UINavigationController* svc = (UINavigationController*) vc;
            if (svc.viewControllers.count > 0)
                return [UIViewController findBestViewController:svc.topViewController];
            else
                return vc;
    
        } else if ([vc isKindOfClass:[UITabBarController class]]) {
    
            // Return visible view
            UITabBarController* svc = (UITabBarController*) vc;
            if (svc.viewControllers.count > 0)
                return [UIViewController findBestViewController:svc.selectedViewController];
            else
                return vc;
    
        } else {
    
            // Unknown view controller type, return last child view controller
            return vc;
    
        }
    
    }
    
    +(UIViewController*) currentViewController {
    
        // Find best view controller
        UIViewController* viewController = [UIApplication sharedApplication].keyWindow.rootViewController;
        return [UIViewController findBestViewController:viewController];
    
    }
    
    @end
    

    实现细节总有遗漏,有时取不对,一般我采用下一种办法

    重起一个windows

    原理就是多windows机制,在当前window之上新建一个windows,可以保证Controller在最上层。跟UIAlertView显示机制一致。当然没UIAlertView级别高,当有UIAlertView弹出时候,再弹出新起的Windows时,UIAlertView还在最上。

    具体使用开源库LNWindowManager即可。

    创建并显示一个Windows

    UIWindow* window = [LNWindowManager templateWindowForName:@"demo"];
    window.rootViewController = nvc;
    
    [[LNWindowManager sharedWindowManager].topWindow presentWindow:window animated:YES completion:nil];
    

    移除windows

    [[LNWindowManager sharedWindowManager].topWindow.presentingWindow dismissWindow:[LNWindowManager sharedWindowManager].topWindow animated:YES completion:nil];
    

    Demo

    别人git上的Demo

    参考文档

    参考一
    参考二
    参考三

    相关文章

      网友评论

          本文标题:保证当前Controller在最顶层

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