MBProgressHUD大家肯定都会用.如何封装成一个好用的HUD是我们需要考虑的事情.这里来说一下封装思路
我们初始化应用的时候都在didfinishlaunch里头初始化_window.也就是Delegate.h里头的一个UIWindow属性.然后设置window的rootVc.那么就是说一般来说Delegate中的window不会切换.那么做一个全局的MBProgressHUD就可以到处调用,好处之一,比如我们在某个Controller里头进行请求.就是比如我们网络请求类里头进行一些公用的处理.(error之类的).在网络请求类里头hide
/// 我们可以这样拿到window.
UIWindow *window = [UIApplication sharedApplication].delegate.window;
/// 这样我们能拿到在某个view上是否有MBProgressHUD.
/// 如果没有会返回nil.有的话就返回一个MBProgressHUD
+ (nullable MBProgressHUD *)HUDForView:(UIView *)view;
/// 如果HUD上有就View就隐藏
/// 隐藏成功返回YES.没有HUD(隐藏失败)返回NO
+ (BOOL)hideHUDForView:(UIView *)view animated:(BOOL)animated;
根据以下API.可以改成这样
1.Delegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
_window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
_window.backgroundColor = [UIColor whiteColor];
ViewController *viewController = [[ViewController alloc] init];
_window.rootViewController = viewController;
[_window makeKeyAndVisible];
return YES;
}
2.CHAddMBProgressHUD.h
//
// CHAddMBProgressHUD.h
// MBProgressTest
//
// Created by 张晨晖 on 2018/7/29.
// Copyright © 2018年 张晨晖. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface CHAddMBProgressHUD : NSObject
+ (instancetype)sharedClass;
- (instancetype)showHUDAtWindowWithTitle:(NSString *)title;
- (void)hideHUDAtWindow;
@end
3.CHAddMBProgressHUD.m
//
// CHAddMBProgressHUD.m
// MBProgressTest
//
// Created by 张晨晖 on 2018/7/29.
// Copyright © 2018年 张晨晖. All rights reserved.
//
#import "CHAddMBProgressHUD.h"
#import "MBProgressHUD.h"
@interface CHAddMBProgressHUD ()
@property (nonatomic ,strong) MBProgressHUD *progressHUD;
@end
@implementation CHAddMBProgressHUD
+ (instancetype)sharedClass {
static dispatch_once_t onceToken;
static CHAddMBProgressHUD *addMBProgressHUD;
dispatch_once(&onceToken, ^{
addMBProgressHUD = [[CHAddMBProgressHUD alloc] init];
});
return addMBProgressHUD;
}
- (MBProgressHUD *)progressHUD {
UIWindow *window = [UIApplication sharedApplication].delegate.window;
MBProgressHUD *progressHUD = [MBProgressHUD HUDForView:window];
if (!progressHUD) {
progressHUD = [MBProgressHUD showHUDAddedTo:window animated:YES];
}
return progressHUD;
}
- (instancetype)showHUDAtWindowWithTitle:(NSString *)title {
self.progressHUD.label.text = title;
return self;
}
- (void)hideHUDAtWindow {
[self.progressHUD hideAnimated:YES afterDelay:2];
}
@end
4.使用
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[[CHAddMBProgressHUD sharedClass] showHUDAtWindowWithTitle:@"呵呵"];
[[CHAddMBProgressHUD sharedClass] hideHUDAtWindow];
}
小Tips.随意在哪里调用showHUDAtWindow.都可以把之前的MBProgressHUD替换掉.少了许多重复代码的”复制粘贴”.