在開發(fā)中經(jīng)常遇到需要添加hud的情形败潦,每次添加的代碼都在10行左右本冲,遂新建一個ViewController的Category來添加hud。由于分類不能直接添加屬性劫扒,就考慮到了runtime檬洞。
下面講具體的實施步驟
新建工程--新建文件,選擇Objective-C File 如下圖:
屏幕快照 2016-01-19 21.43.58.png
導(dǎo)入MBProgressHUD, 現(xiàn)在項目結(jié)構(gòu)如圖:
屏幕快照 2016-01-19 21.48.11.png
在UIViewController+HUD.h中導(dǎo)入MBProgressHUD.h沟饥,
#import <UIKit/UIKit.h>
#import "MBProgressHUD.h"
@interface UIViewController (HUD)
@end
在UIViewController+HUD.m中導(dǎo)入runtime.h疮胖,并添加hud屬性:
#import "UIViewController+HUD.h"
#import <objc/runtime.h>
@interface UIViewController(Private)
@property (nonatomic, strong) MBProgressHUD *progressHud;
@end
@implementation UIViewController (HUD)
const char *kHudKey = "ProgressHUD_Key";
@end
接下來是關(guān)鍵的一步-設(shè)置hud的setter與getter方法:
- (void)setProgressHud:(MBProgressHUD *)progressHud
{
objc_setAssociatedObject(self, kHudKey, progressHud, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (MBProgressHUD *)progressHud
{
MBProgressHUD *hud = objc_getAssociatedObject(self, kHudKey);
if (!hud) {
UIView *view = self.navigationController.view;
hud = [[MBProgressHUD alloc] initWithView:view];
hud.removeFromSuperViewOnHide = YES;
[view addSubview:hud];
self.progressHud = hud;
}
return hud;
}
在setter中設(shè)置連接, 在getter中初始化闷板。
好了澎灸,接下來就可以正常使用屬性了,現(xiàn)在遮晚,我們對hud進行擴展性昭。
寫兩個基本的show、hide方法县遣,其余的實現(xiàn)在其基礎(chǔ)上變化即可:
#pragma mark - Private
- (void)showHudWithMessage:(NSString *)message model:(MBProgressHUDMode)mode
{
if (self.progressHud.taskInProgress) {
return;
}
self.progressHud.taskInProgress = YES;
self.progressHud.mode = mode ?: MBProgressHUDModeIndeterminate;
self.progressHud.labelText = message;
self.progressHud.labelFont = [UIFont systemFontOfSize:15];
[self.progressHud show:YES];
[self.progressHud hide:YES afterDelay:15];
}
- (void)hideHudWithMessage:(NSString *)message image:(UIImage *)image
{
self.progressHud.customView = [[UIImageView alloc] initWithImage:image];
self.progressHud.mode = MBProgressHUDModeCustomView;
self.progressHud.labelText = message;
self.progressHud.labelFont = [UIFont systemFontOfSize:15];
[self.progressHud show:YES];
[self performSelector:@selector(hideHud) withObject:nil afterDelay:0.7];
}
再實現(xiàn)下面的方法大概就夠用了:
- (void)showHud;
- (void)showHudWithMessage:(NSString *)message;
- (void)showDeterminateHudWithMessage:(NSString *)message;
- (void)changeHudProgress:(double)precent;
- (void)hideHud;
- (void)hideHudWithSuccessMessage:(NSString *)message;
- (void)hideHudWithErrorMessage:(NSString *)message;
具體的實現(xiàn)直接看代碼吧糜颠!
https://github.com/Xigtun/RuntimeDemo