IOS获取当前页面的UIViewController及MBProgressHUD简单封装

IOS获取当前页面的UIViewController

在开发中我们经常需要在当前页面提示Tip信息或者Alert,那么比较通用的方法是通过通用的方法拿到当前页面的VC。在MBProgressHUD中我们也需要一个工具类来进行相应的提示。

/**
 获得当前页面

 @return 获得当前页面
 */
+(UIViewController *)getCurrentVC {
    UIViewController *result = nil;
    UIWindow * window = [[UIApplication sharedApplication] keyWindow];
    //app默认windowLevel是UIWindowLevelNormal,如果不是,找到UIWindowLevelNormal的
    if (window.windowLevel != UIWindowLevelNormal) {
        NSArray *windows = [[UIApplication sharedApplication] windows];
        for(UIWindow * tmpWin in windows) {
            if (tmpWin.windowLevel == UIWindowLevelNormal) {
                window = tmpWin;
                break;
            }
        }
    }
    id nextResponder = nil;
    UIViewController *appRootVC = window.rootViewController;
    //如果是present上来的appRootVC.presentedViewController不为nil
    if (appRootVC.presentedViewController) {
        nextResponder = appRootVC.presentedViewController;
    } else {
        UIView *frontView = [[window subviews] objectAtIndex:0];
        nextResponder = [frontView nextResponder];
    }
    
    if ([nextResponder isKindOfClass:[UITabBarController class]]) {
        
        UITabBarController * tabbar = (UITabBarController *)nextResponder;
        UINavigationController * nav = (UINavigationController *)tabbar.viewControllers[tabbar.selectedIndex];
        result = nav.childViewControllers.lastObject;
        
    } else if ([nextResponder isKindOfClass:[UINavigationController class]]){
        UIViewController * nav = (UIViewController *)nextResponder;
        result = nav.childViewControllers.lastObject;
    } else {
        result = nextResponder;
    }
    return result;
}

工具类简单封装

#import "HUDUtil.h"
#import "MBProgressHUD.h"
#import "UtilMacros.h"
#import "AppDelegate.h"
#import "StringMacros.h"

@implementation HUDUtil

/**
 显示alert
 */
+(void)showAlertWithTitle:(NSString *)title andContent:(NSString *)content {
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:title message:content preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {}];
    [alertController addAction:okAction];
    [[HUDUtil getCurrentVC] presentViewController:alertController animated:YES completion:nil];
}

/**
 显示loading
 */
+(void)showLoading {
    MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:[HUDUtil getCurrentVC].view animated:YES];
    hud.label.text = Tip_Loading;
    hud.label.font = [UIFont systemFontOfSize:14.0f];
}

/**
 隐藏loading
 */
+(void)hiddenLoading {
    [MBProgressHUD hideHUDForView:[HUDUtil getCurrentVC].view animated:YES];
}

/**
 显示loading
 
 @param aView 目标显示层
 */
+(void)showLoadingWithView:(UIView *)aView {
    MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:aView animated:YES];
    hud.label.text = Tip_Loading;
    hud.label.font = [UIFont systemFontOfSize:14.0f];
}

/**
 隐藏loading
 
 @param aView 目标显示层
 */
+(void)hiddenLoadingWithView:(UIView *)aView {
    [MBProgressHUD hideHUDForView:aView animated:YES];
}

/**
 显示提示框

 @param message 提示信息
 */
+ (void)showTipWithHud:(NSString*)message{
    UIView *view = [UIApplication sharedApplication].keyWindow;
    MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:view animated:YES];
    [view bringSubviewToFront:hud];
    [hud setOffset:CGPointMake(hud.offset.x, SCREEN_HEIGHT/4)];
    hud.mode = MBProgressHUDModeText;
    hud.detailsLabel.text = message;
    hud.margin = 10.f;
    hud.removeFromSuperViewOnHide = YES;
    [hud hideAnimated:YES afterDelay:1];
}

/**
 获得当前页面

 @return 获得当前页面
 */
+(UIViewController *)getCurrentVC {
    UIViewController *result = nil;
    UIWindow * window = [[UIApplication sharedApplication] keyWindow];
    //app默认windowLevel是UIWindowLevelNormal,如果不是,找到UIWindowLevelNormal的
    if (window.windowLevel != UIWindowLevelNormal) {
        NSArray *windows = [[UIApplication sharedApplication] windows];
        for(UIWindow * tmpWin in windows) {
            if (tmpWin.windowLevel == UIWindowLevelNormal) {
                window = tmpWin;
                break;
            }
        }
    }
    id nextResponder = nil;
    UIViewController *appRootVC = window.rootViewController;
    //如果是present上来的appRootVC.presentedViewController不为nil
    if (appRootVC.presentedViewController) {
        nextResponder = appRootVC.presentedViewController;
    } else {
        UIView *frontView = [[window subviews] objectAtIndex:0];
        nextResponder = [frontView nextResponder];
    }
    
    if ([nextResponder isKindOfClass:[UITabBarController class]]) {
        
        UITabBarController * tabbar = (UITabBarController *)nextResponder;
        UINavigationController * nav = (UINavigationController *)tabbar.viewControllers[tabbar.selectedIndex];
        result = nav.childViewControllers.lastObject;
        
    } else if ([nextResponder isKindOfClass:[UINavigationController class]]){
        UIViewController * nav = (UIViewController *)nextResponder;
        result = nav.childViewControllers.lastObject;
    } else {
        result = nextResponder;
    }
    return result;
}

@end

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,795评论 4 61
  • 很多人都有这样的体验,在遇到一些难过、悲伤或者痛苦的事情的时候,好好地睡上一觉,第二天起来就会觉得没那么伤心了。事...
    妙所阅读 8,668评论 4 5
  • 雨后,卸下满身的疲惫 感受大地的清凉 遍地的青草,从泥土中窜出来 含羞的花朵,发出淡淡的花香 微风中的潮河,轻轻的...
    飞翔的樱花阅读 2,801评论 0 0
  • 初冬的天气变得愈来愈变幻莫测了,昨夜仍是淅沥的小雨伴着一阵阵令人颤粟的寒风,让人清晰地意识到这秋的没落与冬的逼...
    呵呵黄昏阅读 1,378评论 1 4

友情链接更多精彩内容