开发中实用的AlertViewController 扩展

原文链接:https://juejin.im/post/5b517e29e51d45194b18f47f

  —— OC 版本
  使用——看起来不像OC

/// ---------- alert  
UIAlertController.cd_alert
.cd_title(@"提示")
.cd_titleFont(font_16())
.cd_titleColor(color_Txt_1())
.cd_message(@"123456")
.cd_messageFont(font_14())
.cd_messageColor(color_Txt_3())
.cd_actionCustom(^(UIAlertAction * a){
    a.cd_textColor(color_Main_1());
    a.cd_text(@"点我呀");
    a.cd_style(UIAlertActionStyleCancel);
    a.cd_handler(^(UIAlertAction * a){
        NSLog(@"点击了 点我呀");
    });
})
.cd_actionHandler(^(UIAlertAction * b){
    NSLog(@"点击了 啥都没有");
})
.cd_action(@"去去去")
.cd_show();
/// ---------- sheet
UIAlertController * sheet = UIAlertController.cd_sheet;
sheet.cd_actionCustom(^(UIAlertAction * a){
    a.cd_textColor(color_Main_1());
    a.cd_text(@"点我呀");
    a.cd_style(UIAlertActionStyleCancel);
    a.cd_handler(^(UIAlertAction * a){
        NSLog(@"点击了 点我呀");
    });
})
.cd_actionCustom(^(UIAlertAction * b){
    b.cd_text(@"什么都没有");
})
.cd_action(@"去去去")
.cd_show();
// 自定义 UI 插入
UIButton * button = UIButton.cd_init;
printf("retain self.al = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(button)));
button.cd_bgColor([UIColor redColor])
.cd_cornerRadius(8.0f)
.cd_masonry(sheet.view, ^(MASConstraintMaker *make) {
    make.left.right.bottom.equalTo(sheet.view);
    make.height.equalTo(@55);
 });
  sheet.cd_hidden();//自动 dismiss

就这么搞 ----- UIAlertController 扩展
.h

#import <UIKit/UIKit.h>

@interface UIAlertController (CD)

pragma mark ----- 初始化

/// 初始化 样式 Alert
+ (UIAlertController*)cd_alert;
/// 初始化 样式 ActionSheet
+ (UIAlertController*)cd_sheet;
/// 初始化
+ (UIAlertController*)cd_alert:(UIAlertControllerStyle)style;
#pragma mark ----- 显示
/// 显示 默认获取顶层 VC
- (UIAlertController *(^)(void))cd_show;
/// 显示 传入 vc
- (UIAlertController *(^)(UIViewController* ))cd_showVC;
/// 显示  present 完成后 自定义内容 completion
- (UIAlertController *(^)(UIViewController* vc, void (^block)(void)))cd_showBlock;

#pragma mark ----- 消失
/// 消失 默认 1.0 秒后
- (void (^)(void))cd_hidden;
/// 消失 默认 1.0 秒后 消失后回调 Completion 自定义内容
- (void(^)(void (^)(void)))cd_hiddenBlock;
/// 消失 设置延时时间 消失后回调 block 自定义内容
- (void(^)(NSTimeInterval time, void (^block)(void)))cd_hiddenTimeBlock;

pragma mark ----- 标题样式

/// 设置标题
- (UIAlertController *(^)(NSString*))cd_title;
/// 设置标题字体
- (UIAlertController *(^)(UIFont*))cd_titleFont;
/// 设置标题颜色
- (UIAlertController *(^)(UIColor*))cd_titleColor;
/// 设置标题 自定义富文本
- (UIAlertController *(^)(NSAttributedString*))cd_titleAttributed;
//#pragma mark ----- Msg 样式
/// 设置副标题
- (UIAlertController *(^)(NSString*))cd_message;
/// 设置副标题字体
- (UIAlertController *(^)(UIFont*))cd_messageFont;
/// 设置副标题颜色
- (UIAlertController *(^)(UIColor*))cd_messageColor;
/// 设置副标题 自定义富文本
- (UIAlertController *(^)(NSString*))cd_messageAttributed;
#pragma mark ----- 按钮
/// 按钮
- (UIAlertController *(^)(NSString*))cd_action;
/// 按钮 + 回调
- (UIAlertController *(^)(void (^)(UIAlertAction *action)))cd_actionHandler;
/// 按钮 + 自定义 回调包含在内
- (UIAlertController *(^)(void(^)(UIAlertAction * action)))cd_actionCustom;
@end

@interface UIAlertAction (CD)
/// 设置按钮文字
- (UIAlertAction *(^)(NSString*))cd_text;
/// 设置按钮 字体色
- (UIAlertAction *(^)(UIColor*))cd_textColor;
/// 设置按钮 样式 UIAlertActionStyle
- (UIAlertAction *(^)(UIAlertActionStyle))cd_style;
/// 点击回调
- (UIAlertAction *(^)(void(^handler)(UIAlertAction * _Nonnull action)))cd_handler;
@end

.m

#import "UIAlertController+CD.h"

@implementation UIAlertController (CD)
#pragma mark ----- 初始化
+ (UIAlertController*)cd_alert{
    return [UIAlertController cd_alert:UIAlertControllerStyleAlert];
}
+ (UIAlertController*)cd_sheet{
return [UIAlertController cd_alert:UIAlertControllerStyleActionSheet];
}
+ (UIAlertController*)cd_alert:(UIAlertControllerStyle)style{
return [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:style];
}

pragma mark ----- 显示

- (UIAlertController *(^)(void))cd_show{
return ^(void){
    self.cd_showBlock(nil,nil);
    return self;
};
}
- (UIAlertController *(^)(UIViewController* ))cd_showVC{
return ^(UIViewController* vc){
    self.cd_showBlock(vc,nil);
    return self;
};
}
- (UIAlertController *(^)(UIViewController* vc, void (^block)(void)))cd_showBlock{
return ^id(UIViewController* vc, void (^block)(void)){
    if (!self.title && !self.message && self.actions.count==0) {
        NSLog(@"💀💀大哥!你别这样,什么东西都不放,俺会崩溃的💀💀");
        return nil;
    }
    [vc?vc:cd_MVVMVC() presentViewController:self animated:YES completion:block];
    return self;
};
}

#pragma mark ----- 消失
- (void (^)(void))cd_hidden{
   return ^(void){
   self.cd_hiddenBlock(nil);
};
}
- (void(^)(void (^)(void)))cd_hiddenBlock{
return ^(void (^block)(void)){
    self.cd_hiddenTimeBlock(1.0,block);
};
}
- (void(^)(NSTimeInterval time, void (^block)(void)))cd_hiddenTimeBlock{
@weakify(self);
return ^(NSTimeInterval time,void (^block)(void)){
    @strongify(self);
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(time * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        @strongify(self);
        [self dismissViewControllerAnimated:YES completion:block];
    });
};

}
#pragma mark ----- Title 样式
- (UIAlertController *(^)(NSString*))cd_title{
return ^(NSString* title){
    self.title = title;
    return self;
};
}
- (UIAlertController *(^)(UIFont*))cd_titleFont{
return ^(UIFont* font){
    if (self.title.length>0) {
        NSAttributedString * attributedMessage = [self valueForKey:@"attributedTitle"];
        NSMutableAttributedString *attributedString;
        if (attributedMessage) {
            attributedString = [[NSMutableAttributedString alloc] initWithAttributedString:attributedMessage];
        }else{
            attributedString = [[NSMutableAttributedString alloc] initWithString:self.title];
        }
        [attributedString addAttribute:NSFontAttributeName value:font range:NSMakeRange(0, attributedString.length)];
        [self setValue:attributedString forKey:@"attributedTitle"];
    }
    return self;
};
}
- (UIAlertController *(^)(UIColor*))cd_titleColor{
return ^(UIColor* color){
    if (self.title.length>0) {
        NSAttributedString * attributedMessage = [self valueForKey:@"attributedTitle"];
        NSMutableAttributedString *attributedString;
        if (attributedMessage) {
            attributedString = [[NSMutableAttributedString alloc] initWithAttributedString:attributedMessage];
        }else{
            attributedString = [[NSMutableAttributedString alloc] initWithString:self.title];
        }
        [attributedString addAttribute:NSForegroundColorAttributeName value:color range:NSMakeRange(0, attributedString.length)];
        [self setValue:attributedString forKey:@"attributedTitle"];
    }
    return self;
};
}
- (UIAlertController *(^)(NSAttributedString*))cd_titleAttributed{
return ^(NSAttributedString* string){
    [self setValue:string forKey:@"attributedTitle"];
    return self;
};
}
#pragma mark ----- Msg 样式
- (UIAlertController *(^)(NSString*))cd_message{
return ^(NSString* message){
    self.message = message;
    return self;
};
}
- (UIAlertController *(^)(UIFont*))cd_messageFont{
return ^(UIFont* font){
    if (self.message.length>0) {
        NSAttributedString * attributedMessage = [self valueForKey:@"attributedMessage"];
        NSMutableAttributedString *attributedString;
        if (attributedMessage) {
            attributedString = [[NSMutableAttributedString alloc] initWithAttributedString:attributedMessage];
        }else{
            attributedString = [[NSMutableAttributedString alloc] initWithString:self.message];
        }
        [attributedString addAttribute:NSFontAttributeName value:font range:NSMakeRange(0, attributedString.length)];
        [self setValue:attributedString forKey:@"attributedMessage"];
    }
    return self;
};
}

- (UIAlertController *(^)(UIColor*))cd_messageColor{
return ^(UIColor* color){
    if (self.message.length>0) {
        NSAttributedString * attributedMessage = [self valueForKey:@"attributedMessage"];
        NSMutableAttributedString *attributedString;
        if (attributedMessage) {
            attributedString = [[NSMutableAttributedString alloc] initWithAttributedString:attributedMessage];
        }else{
            attributedString = [[NSMutableAttributedString alloc] initWithString:self.message];
        }
        
        [attributedString addAttribute:NSForegroundColorAttributeName value:color range:NSMakeRange(0, attributedString.length)];
        [self setValue:attributedString forKey:@"attributedMessage"];
    }
    return self;
};
}
- (UIAlertController *(^)(NSString*))cd_messageAttributed{
return ^(NSString* string){
    [self setValue:string forKey:@"attributedMessage"];
    return self;
};
}
#pragma mark ----- 按钮
- (UIAlertController *(^)(NSString*))cd_action{
return ^(NSString* text){
    UIAlertAction * action = [UIAlertAction actionWithTitle:text style:0 handler:nil];
    [self addAction:action];
    return self;
};
}
- (UIAlertController *(^)(void (^)(UIAlertAction *action)))cd_actionHandler{
return ^(void (^handler)(UIAlertAction *action)){
    UIAlertAction * action = [UIAlertAction actionWithTitle:@"" style:0 handler:handler];
    [self addAction:action];
    return self;
};
}
- (UIAlertController *(^)(void(^custom)(UIAlertAction * action)))cd_actionCustom{
return ^(void(^custom)(UIAlertAction * action)){
    UIAlertAction * action = [UIAlertAction actionWithTitle:@"" style:0 handler:nil];
    if (custom) {
        custom(action);
    }
    [self addAction:action];
    return self;
};
}
@end


@implementation UIAlertAction (CD)

- (UIAlertAction *(^)(NSString*))cd_text{
return ^(NSString* text){
    if (text) {
        [self setValue:text forKey:@"title"];
    }
    return self;
};
}
- (UIAlertAction *(^)(UIColor*))cd_textColor{
return ^(UIColor* color){
    if (color) {
        [self setValue:color forKey:@"titleTextColor"];
    }
    return self;
};
}

- (UIAlertAction *(^)(UIAlertActionStyle))cd_style{
return ^(UIAlertActionStyle style){
    [self setValue:@(style) forKey:@"style"];
    return self;
};
}
- (UIAlertAction *(^)(void(^handler)(UIAlertAction * _Nonnull action)))cd_handler{
return ^(void(^handler)(UIAlertAction * _Nonnull action)){
    [self setValue:handler forKey:@"handler"];
    return self;
};
}
@end

推荐阅读更多精彩内容