iOS开发之自己封装了的AlertController
白羽 2018-07-16 来源 :网络 阅读 840 评论 0

摘要:本文将带你了解iOS开发之自己封装了的AlertController,希望本文对大家学IOS有所帮助。


  
  
  
   一直觉得使用系统这个东西写起来特别麻烦,每次都要写一大推东西,还是重复的,今天抽了点时间自己重新封装了一下,解决了自己的强迫症。。。,不多说,直接上代码了。
1.自己定义了一个名为XBZ的UIAlertViewControllerde 分类,.h文件里面

  1 #import <UIKit/UIKit.h>
  2 
  3 typedef void(^ActionOne)(void);
  4 
  5 typedef void(^ActionTwo)(void);
  6 
  7 @interface UIAlertController (XBZ)
  8 
  9 /**
 10  只显示标题,默认2s后dismiss
 11  
 12  @param controller 当前弹出的控制器
 13  @param title 标题
 14  */
 15 + (void)alertWithController:(nonnull UIViewController *)controller
 16                       title:(nonnull NSString *)title;
 17 
 18 
 19 /**
 20  只显示标题,自定义dismiss时间
 21  
 22  @param controller 当前弹出的控制器
 23  @param title 标题
 24  @param timerInerval dismiss时间
 25  */
 26 + (void)alertWithController:(nonnull UIViewController *)controller
 27                       title:(nonnull NSString *)title
 28                timeInterval:(NSTimeInterval)timerInerval;
 29 
 30 /**
 31  显示标题+消息,默认显示2s后dismiss
 32  
 33  @param controller 当前弹出的控制器
 34  @param title 标题
 35  @param message 消息内容
 36  */
 37 + (void)alertWithController:(nonnull UIViewController *)controller
 38                       title:(nonnull NSString *)title
 39                     message:(nonnull NSString *)message;
 40 
 41 /**
 42  显示标题+消息,可自定义dismiss时间
 43  
 44  @param controller 当前弹出的控制器
 45  @param title 标题
 46  @param message 消息内容
 47  @param timerInerval dismiss时间
 48  */
 49 + (void)alertWithController:(nonnull UIViewController *)controller
 50                       title:(nonnull NSString *)title
 51                     message:(nonnull NSString *)message
 52                timeInterval:(NSTimeInterval)timerInerval;
 53 
 54 
 55 
 56 /**
 57  显示默认弹出和按钮风格(常用一)
 58  
 59  @param controller 当前弹出的控制器
 60  @param title 标题
 61  @param message 消息内容
 62  @param titles 按钮标题数组,可只传一个,actionTwo置nil
 63  @param actionOne 第一个按钮事件
 64  @param actionTwo 第二个按钮事件
 65  */
 66 + (void)alertWithController:(nonnull UIViewController *)controller
 67                       title:(NSString *)title
 68                     message:(NSString *)message
 69                actionTitles:(nonnull NSArray<NSString *> *)titles
 70                   actionOne:(ActionOne)actionOne
 71                   actionTwo:(ActionTwo)actionTwo;
 72 
 73 /**
 74  显示默认按钮风格,可自定义弹出风格
 75  
 76  @param controller 当前弹出的控制器
 77  @param title 标题
 78  @param message 消息内容
 79  @param titles 按钮标题数组,可只传一个,actionTwo置nil
 80  @param actionOne 第一个按钮事件
 81  @param actionTwo 第二个按钮事件
 82  @param isAlertStyle 弹出方式,YES为Alert,NO为Sheet,采用sheet时会自动加上cacel按钮
 83  */
 84 + (void)alertWithController:(nonnull UIViewController *)controller
 85                       title:(NSString *)title
 86                     message:(NSString *)message
 87                actionTitles:(nonnull NSArray<NSString *> *)titles
 88                   actionOne:(ActionOne)actionOne
 89                   actionTwo:(ActionTwo)actionTwo
 90                isAlertStyle:(BOOL)isAlertStyle;
 91 
 92 
 93 /**
 94  显示默认弹出风格,可自定义按钮风格(常用二)
 95  
 96  @param controller 当前弹出的控制器
 97  @param title 标题
 98  @param message 消息内容
 99  @param titles 按钮标题数组,可只传一个,actionTwo置nil
100  @param actionStyles 自定义按钮风格
101  @param actionOne 第一个按钮事件
102  @param actionTwo 第二个按钮事件
103  */
104 + (void)alertWithController:(nonnull UIViewController *)controller
105                       title:(NSString *)title
106                     message:(NSString *)message
107                actionTitles:(nonnull NSArray<NSString *> *)titles
108                actionStyles:(NSArray<NSNumber *> *)actionStyles
109                   actionOne:(ActionOne)actionOne
110                   actionTwo:(ActionOne)actionTwo;
111 
112 /**
113  自定义弹出风格和按钮风格
114  
115  @param controller 当前弹出的控制器
116  @param title 标题
117  @param message 消息内容
118  @param titles 按钮标题数组,可只传一个,actionTwo置nil
119  @param actionStyles action风格,数组形式
120  @param actionOne 第一个按钮事件
121  @param actionTwo 第二个按钮事件
122  @param isAlertStyle 弹出方式,YES为Alert,NO为Sheet,采用sheet时会自动加上cacel按钮
123  */
124 + (void)alertWithController:(nonnull UIViewController *)controller
125                       title:(NSString *)title
126                     message:(NSString *)message
127                actionTitles:(nonnull NSArray<NSString *> *)titles
128                actionStyles:(NSArray<NSNumber *> *)actionStyles
129                   actionOne:(ActionOne)actionOne
130                   actionTwo:(ActionOne)actionTwo
131                isAlertStyle:(BOOL)isAlertStyle;
132 
133 @end

 
2.然后是.m文件

  1 #import "UIAlertController+XBZ.h"
  2 
  3 NSTimeInterval kDefaultTimerInterval = 2.f;
  4 
  5 @implementation UIAlertController (XBZ)
  6 
  7 
  8 + (void)alertWithController:(nonnull UIViewController *)controller
  9                       title:(NSString *)title {
 10     
 11     [self alertWithController:controller title:title timeInterval:kDefaultTimerInterval];
 12     
 13 }
 14 
 15 + (void)alertWithController:(nonnull UIViewController *)controller
 16                       title:(NSString *)title
 17                timeInterval:(NSTimeInterval)timerInerval {
 18     
 19     [self alertWithController:controller title:title message:@"" timeInterval:timerInerval];
 20     
 21 }
 22 
 23 + (void)alertWithController:(nonnull UIViewController *)controller
 24                       title:(NSString *)title
 25                     message:(NSString *)message {
 26     
 27     [self alertWithController:controller title:title message:message timeInterval:kDefaultTimerInterval];
 28     
 29 }
 30 
 31 
 32 + (void)alertWithController:(nonnull UIViewController *)controller
 33                       title:(NSString *)title
 34                     message:(NSString *)message
 35                timeInterval:(NSTimeInterval)timerInerval {
 36     
 37     UIAlertController *alertController = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert];
 38     
 39     [NSTimer scheduledTimerWithTimeInterval:timerInerval target:self selector:@selector(dismissAlertController:) userInfo:alertController repeats:NO];
 40     
 41     [controller presentViewController:alertController animated:YES completion:nil];
 42 }
 43 
 44 + (void)alertWithController:(nonnull UIViewController *)controller
 45                       title:(NSString *)title
 46                     message:(NSString *)message
 47                actionTitles:(nonnull NSArray<NSString *> *)titles
 48                   actionOne:(ActionOne)actionOne
 49                   actionTwo:(ActionTwo)actionTwo {
 50     
 51     [self alertWithController:controller title:title message:message actionTitles:titles actionOne:actionOne actionTwo:actionTwo isAlertStyle:YES];
 52 }
 53 
 54 + (void)alertWithController:(nonnull UIViewController *)controller
 55                       title:(NSString *)title
 56                     message:(NSString *)message
 57                actionTitles:(nonnull NSArray<NSString *> *)titles
 58                   actionOne:(ActionOne)actionOne
 59                   actionTwo:(ActionTwo)actionTwo
 60                isAlertStyle:(BOOL)isAlertStyle; {
 61     
 62     UIAlertController *alertController = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:isAlertStyle ? UIAlertControllerStyleAlert : UIAlertControllerStyleActionSheet];
 63     
 64     switch (titles.count) {
 65             break;
 66         case 1:
 67         {
 68             [alertController addAction:[UIAlertAction actionWithTitle:titles.firstObject style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
 69                 if (actionOne) {
 70                     actionOne();
 71                 }
 72             }]];
 73         }
 74             break;
 75         case 2:
 76         {
 77             [alertController addAction:[UIAlertAction actionWithTitle:titles.firstObject style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
 78                 if (actionOne) {
 79                     actionOne();
 80                 }
 81             }]];
 82             [alertController addAction:[UIAlertAction actionWithTitle:titles.lastObject style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
 83                 if (actionTwo) {
 84                     actionTwo();
 85                 }
 86             }]];
 87         }
 88             break;
 89         default:
 90             break;
 91     }
 92     
 93     
 94     if (!isAlertStyle) {
 95         [alertController addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:NULL]];
 96     }
 97     
 98     [controller presentViewController:alertController animated:YES completion:nil];
 99 }
100 
101 
102 + (void)alertWithController:(nonnull UIViewController *)controller
103                       title:(NSString *)title
104                     message:(NSString *)message
105                actionTitles:(nonnull NSArray<NSString *> *)titles
106                actionStyles:(NSArray<NSNumber *> *)actionStyles
107                   actionOne:(ActionOne)actionOne
108                   actionTwo:(ActionOne)actionTwo {
109     
110     [self alertWithController:controller title:title message:message actionTitles:titles actionStyles:actionStyles actionOne:actionOne actionTwo:actionTwo isAlertStyle:YES];
111     
112 }
113 
114 + (void)alertWithController:(nonnull UIViewController *)controller
115                       title:(NSString *)title
116                     message:(NSString *)message
117                actionTitles:(nonnull NSArray<NSString *> *)titles
118                actionStyles:(NSArray<NSNumber *> *)actionStyles
119                   actionOne:(ActionOne)actionOne
120                   actionTwo:(ActionOne)actionTwo
121                isAlertStyle:(BOOL)isAlertStyle {
122     
123     UIAlertController *alertController = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:isAlertStyle ? UIAlertControllerStyleAlert : UIAlertControllerStyleActionSheet];
124     
125     switch (titles.count) {
126             break;
127         case 1:
128         {
129             UIAlertActionStyle style = actionStyles.firstObject ? [actionStyles.firstObject integerValue] : UIAlertActionStyleDefault;
130             [alertController addAction:[UIAlertAction actionWithTitle:titles.firstObject style:style handler:^(UIAlertAction * _Nonnull action) {
131                 if (actionOne) {
132                     actionOne();
133                 }
134             }]];
135         }
136             break;
137         case 2:
138         {
139             UIAlertActionStyle styleOne = actionStyles.firstObject ? [actionStyles.firstObject integerValue] : UIAlertActionStyleDefault;
140             UIAlertActionStyle styleTwo = actionStyles.lastObject ? [actionStyles.lastObject integerValue] : UIAlertActionStyleDefault;
141             [alertController addAction:[UIAlertAction actionWithTitle:titles.firstObject style:styleOne handler:^(UIAlertAction * _Nonnull action) {
142                 if (actionOne) {
143                     actionOne();
144                 }
145             }]];
146             [alertController addAction:[UIAlertAction actionWithTitle:titles.lastObject style:styleTwo handler:^(UIAlertAction * _Nonnull action) {
147                 if (actionTwo) {
148                     actionTwo();
149                 }
150             }]];
151         }
152             break;
153         default:
154             break;
155     }
156     
157     
158     if (!isAlertStyle) {
159         [alertController addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:NULL]];
160     }
161     
162     [controller presentViewController:alertController animated:YES completion:nil];
163     
164 }
165 
166 + (void)dismissAlertController:(NSTimer *)timer {
167     
168     UIAlertController *alertController = timer.userInfo;
169     
170     [alertController dismissViewControllerAnimated:YES completion:nil];
171     
172     [timer invalidate];
173     timer = nil;
174 }
175 
176 @end

 
 
3.调用方法~

 1 - (IBAction)example1:(id)sender {
 2     
 3     [UIAlertController alertWithController:self title:@"这是我的标题,我会自动2s消失"];
 4     
 5 }
 6 
 7 - (IBAction)example2:(id)sender {
 8     
 9     [UIAlertController alertWithController:self title:@"这是我的标题,我会根据时间来让我消失" timeInterval:4.f];
10     
11 }
12 - (IBAction)example3:(id)sender {
13     
14     [UIAlertController alertWithController:self title:@"我是带message的,我会自动2s消失" message:@"我是message"];
15     
16 }
17 - (IBAction)example4:(id)sender {
18     
19     [UIAlertController alertWithController:self title:@"我是带message的,我根据时间来让我消失" message:@"我是message" timeInterval:3.f];
20     
21 }
22 - (IBAction)example5:(id)sender {
23     
24     [UIAlertController alertWithController:self title:@"我是带按钮的" message:@"我还是个消息" actionTitles:@[@"确定", @"取消"] actionOne:^{
25         
26         NSLog(@"点了确定了");
27         
28     } actionTwo:^{
29         
30         NSLog(@"点了取消了");
31         
32     } isAlertStyle:YES];
33     
  }
41 - (IBAction)example6:(id)sender {
42     
43     [UIAlertController alertWithController:self title:@"我是能自定义action style的" message:@"我就是个消息" actionTitles:@[@"确定", @"取消"] actionStyles:@[@(UIAlertActionStyleDefault), @(UIAlertActionStyleDestructive)] actionOne:^{
44         
45         NSLog(@"点了确定了");
46         
47     } actionTwo:^{
48         
49         NSLog(@"点了取消了");
50         
51     } isAlertStyle:YES];
52     
53 }
54 
55 - (IBAction)example7:(id)sender {
56     
57     [UIAlertController alertWithController:self title:@"我是带按钮的" message:@"我还是个消息" actionTitles:@[@"确定", @"取消"] actionOne:^{
58         
59         NSLog(@"点了确定了");
60         
61     } actionTwo:^{
62         
63         NSLog(@"点了取消了");
64         
65     } isAlertStyle:NO];
66     
67 }

 
目前就写了最多两个按钮的情况,代码也算简化了不少,看着没那么乱了,再多的按钮就单独写吧,反正用得不多。-_-
最后附上demo地址吧:https://github.com/BigKingQY/XBZAlertViewController_Demo.git
写完才发现,名字里面多了个view...就不改了...-_-!!





 
    


本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之IOS频道!


本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程