原文链接: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