干货!UIAlertController 扩展,优雅的链式

—— 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

复制代码

Swift 版本

转载于:https://juejin.im/post/5b517e29e51d45194b18f47f

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值