保证当前Controller在最顶层

2017-05-04  本文已影响0人  ashura_

问题

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

解决方案

获取到当前最顶层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

参考文档

参考一
参考二
参考三

上一篇下一篇

猜你喜欢

热点阅读