自己封装了的AlertController

Posted bigkingblog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自己封装了的AlertController相关的知识,希望对你有一定的参考价值。

一直觉得使用系统这个东西写起来特别麻烦,每次都要写一大推东西,还是重复的,今天抽了点时间自己重新封装了一下,解决了自己的强迫症。。。,不多说,直接上代码了。

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  不带message的弹出提示,默认显示2s自动dismiss
11 
12  @param controller 当前弹出的控制器
13  @param title 标题
14  */
15 + (void)alertWithController:(nonnull UIViewController *)controller title:(nonnull NSString *)title;
16 
17 
18 /**
19  不带message的弹出提示,可自定义dismiss时间
20 
21  @param controller 当前弹出的控制器
22  @param title 标题
23  @param timerInerval dismiss时间
24  */
25 + (void)alertWithController:(nonnull UIViewController *)controller title:(nonnull NSString *)title timeInterval:(NSTimeInterval)timerInerval;
26 
27 /**
28  带message的弹出提示,默认显示2s自动dismiss掉
29 
30  @param controller 当前弹出的控制器
31  @param title 标题
32  @param message 消息内容
33  */
34 + (void)alertWithController:(nonnull UIViewController *)controller title:(nonnull NSString *)title message:(nonnull NSString *)message;
35 
36 /**
37  带message的弹出提示,可自定义dismiss时间
38 
39  @param controller 当前弹出的控制器
40  @param title 标题
41  @param message 消息内容
42  @param timerInerval dismiss时间
43  */
44 + (void)alertWithController:(nonnull UIViewController *)controller title:(nonnull NSString *)title message:(nonnull NSString *)message timeInterval:(NSTimeInterval)timerInerval;
45 
46 
47 /**
48  使用默认action风格的alert,最多支持两个按钮(一般两个就够了)
49 
50  @param controller 当前弹出的控制器
51  @param title 标题
52  @param message 消息内容
53  @param titles 按钮标题数组
54  @param actionOne 第一个按钮事件
55  @param actionTwo 第二个按钮事件
56  @param alertStyle 弹出方式,采用sheet时会自动加上cacel按钮
57  */
58 + (void)alertWithController:(nonnull UIViewController *)controller title:(NSString *)title message:(NSString *)message actionTitles:(nonnull NSArray<NSString *> *)titles actionOne:(ActionOne)actionOne actionTwo:(ActionTwo)actionTwo alertStyle:(UIAlertControllerStyle)alertStyle;
59 
60 /**
61  可自己定义action风格的alert
62 
63  @param controller 当前弹出的控制器
64  @param title 标题
65  @param message 消息内容
66  @param titles 按钮标题数组
67  @param actionStyles action风格,数组形式
68  @param actionOne 第一个按钮事件
69  @param actionTwo 第二个按钮事件
70  @param alertStyle 弹出方式,采用sheet时会自动加上cacel按钮
71  */
72 + (void)alertWithController:(nonnull UIViewController *)controller title:(NSString *)title message:(NSString *)message actionTitles:(nonnull NSArray<NSString *> *)titles actionStyles:(NSArray<NSNumber *> *)actionStyles actionOne:(ActionOne)actionOne actionTwo:(ActionOne)actionTwo alertStyle:(UIAlertControllerStyle)alertStyle;
73 
74 @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 title:(NSString *)title {
  9     
 10     UIAlertController *alertController = [UIAlertController alertControllerWithTitle:title message:@"" preferredStyle:UIAlertControllerStyleAlert];
 11     
 12     [NSTimer scheduledTimerWithTimeInterval:kDefaultTimerInterval target:self selector:@selector(dismissAlertController:) userInfo:alertController repeats:NO];
 13     
 14     [controller presentViewController:alertController animated:YES completion:nil];
 15     
 16 }
 17 
 18 + (void)alertWithController:(nonnull UIViewController *)controller title:(NSString *)title timeInterval:(NSTimeInterval)timerInerval {
 19     UIAlertController *alertController = [UIAlertController alertControllerWithTitle:title message:@"" preferredStyle:UIAlertControllerStyleAlert];
 20     
 21     [NSTimer scheduledTimerWithTimeInterval:timerInerval target:self selector:@selector(dismissAlertController:) userInfo:alertController repeats:NO];
 22     
 23     [controller presentViewController:alertController animated:YES completion:nil];
 24 }
 25 
 26 + (void)alertWithController:(nonnull UIViewController *)controller title:(NSString *)title message:(NSString *)message {
 27     
 28     UIAlertController *alertController = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert];
 29     
 30     [NSTimer scheduledTimerWithTimeInterval:kDefaultTimerInterval target:self selector:@selector(dismissAlertController:) userInfo:alertController repeats:NO];
 31     
 32     [controller presentViewController:alertController animated:YES completion:nil];
 33     
 34 }
 35 
 36 
 37 + (void)alertWithController:(nonnull UIViewController *)controller title:(NSString *)title message:(NSString *)message timeInterval:(NSTimeInterval)timerInerval {
 38     UIAlertController *alertController = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert];
 39     
 40     [NSTimer scheduledTimerWithTimeInterval:timerInerval target:self selector:@selector(dismissAlertController:) userInfo:alertController repeats:NO];
 41     
 42     [controller presentViewController:alertController animated:YES completion:nil];
 43 }
 44 
 45 + (void)alertWithController:(nonnull UIViewController *)controller title:(NSString *)title message:(NSString *)message actionTitles:(nonnull NSArray<NSString *> *)titles actionOne:(ActionOne)actionOne actionTwo:(ActionTwo)actionTwo alertStyle:(UIAlertControllerStyle)alertStyle {
 46     
 47     UIAlertController *alertController = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:alertStyle];
 48     
 49     switch (titles.count) {
 50             break;
 51         case 1:
 52         {
 53             [alertController addAction:[UIAlertAction actionWithTitle:titles.firstObject style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
 54                 if (actionOne) {
 55                     actionOne();
 56                 }
 57             }]];
 58         }
 59             break;
 60         case 2:
 61         {
 62             [alertController addAction:[UIAlertAction actionWithTitle:titles.firstObject style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
 63                 if (actionOne) {
 64                     actionOne();
 65                 }
 66             }]];
 67             [alertController addAction:[UIAlertAction actionWithTitle:titles.lastObject style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
 68                 if (actionTwo) {
 69                     actionTwo();
 70                 }
 71             }]];
 72         }
 73             break;
 74         default:
 75             break;
 76     }
 77     
 78     
 79     if (alertStyle == UIAlertControllerStyleActionSheet) {
 80         [alertController addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:NULL]];
 81     }
 82     
 83     [controller presentViewController:alertController animated:YES completion:nil];
 84 }
 85 
 86 + (void)alertWithController:(nonnull UIViewController *)controller title:(NSString *)title message:(NSString *)message actionTitles:(nonnull NSArray<NSString *> *)titles actionStyles:(NSArray<NSNumber *> *)actionStyles actionOne:(ActionOne)actionOne actionTwo:(ActionOne)actionTwo alertStyle:(UIAlertControllerStyle)alertStyle {
 87     
 88     UIAlertController *alertController = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:alertStyle];
 89     
 90     switch (titles.count) {
 91             break;
 92         case 1:
 93         {
 94             UIAlertActionStyle style = actionStyles.firstObject ? [actionStyles.firstObject integerValue] : UIAlertActionStyleDefault;
 95             [alertController addAction:[UIAlertAction actionWithTitle:titles.firstObject style:style handler:^(UIAlertAction * _Nonnull action) {
 96                 if (actionOne) {
 97                     actionOne();
 98                 }
 99             }]];
100         }
101             break;
102         case 2:
103         {
104             UIAlertActionStyle styleOne = actionStyles.firstObject ? [actionStyles.firstObject integerValue] : UIAlertActionStyleDefault;
105             UIAlertActionStyle styleTwo = actionStyles.lastObject ? [actionStyles.lastObject integerValue] : UIAlertActionStyleDefault;
106             [alertController addAction:[UIAlertAction actionWithTitle:titles.firstObject style:styleOne handler:^(UIAlertAction * _Nonnull action) {
107                 if (actionOne) {
108                     actionOne();
109                 }
110             }]];
111             [alertController addAction:[UIAlertAction actionWithTitle:titles.lastObject style:styleTwo handler:^(UIAlertAction * _Nonnull action) {
112                 if (actionTwo) {
113                     actionTwo();
114                 }
115             }]];
116         }
117             break;
118         default:
119             break;
120     }
121     
122     
123     if (alertStyle == UIAlertControllerStyleActionSheet) {
124         [alertController addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:NULL]];
125     }
126     
127     [controller presentViewController:alertController animated:YES completion:nil];
128     
129 }
130 
131 + (void)dismissAlertController:(NSTimer *)timer {
132     
133     UIAlertController *alertController = timer.userInfo;
134     
135     [alertController dismissViewControllerAnimated:YES completion:nil];
136 
137     [timer invalidate];
138     timer = nil;
139 }
140 
141 @end

 

3.调用方法,就统一写到一个方法里面了~

 1 - (void)example {
 2     
 3     [UIAlertController alertWithController:self title:@"这是我的标题,我会自动2s消失"];
 4     
 5     [UIAlertController alertWithController:self title:@"这是我的标题,我会根据时间来让我消失" timeInterval:4.f];
 6     
 7     [UIAlertController alertWithController:self title:@"我是带message的,我会自动2s消失" message:@"我是message"];
 8     
 9     [UIAlertController alertWithController:self title:@"我是带message的,我根据时间来让我消失" message:@"我是message" timeInterval:3.f];
10     
11     [UIAlertController alertWithController:self title:@"我是带按钮的,使用默认风格的action style" message:@"我还是个消息" actionTitles:@[@"确定", @"取消"] actionOne:^{
12         
13         NSLog(@"点了确定了");
14         
15     } actionTwo:^{
16         
17         NSLog(@"点了取消了");
18         
19     } alertStyle:UIAlertControllerStyleAlert];
20     
21     [UIAlertController alertWithController:self title:@"我是带按钮的,能自定义action style的" message:@"我就是个消息" actionTitles:@[@"确定", @"取消"] actionStyles:@[@(UIAlertActionStyleDefault), @(UIAlertActionStyleDestructive)] actionOne:^{
22         
23         NSLog(@"点了确定了");
24         
25     } actionTwo:^{
26         
27         NSLog(@"点了取消了");
28         
29     } alertStyle:UIAlertControllerStyleAlert];
30     
31 }

目前就写了最多两个按钮的情况,代码也算简化了不少,看着没那么乱了,再多的按钮就单独写吧,反正用得不多。-_-

最后附上demo地址吧:https://github.com/BigKingQY/XBZAlertViewController_Demo.git

写完才发现,名字里面多了个view...就不改了...-_-!!

以上是关于自己封装了的AlertController的主要内容,如果未能解决你的问题,请参考以下文章

AlertController的使用

膨胀类 android.support.v7.app.AlertController.RecycleListView 时出错

在通过代码呈现的另一个 ViewController 上显示 AlertController

VSCode自定义代码片段14——Vue的axios网络请求封装

VSCode自定义代码片段14——Vue的axios网络请求封装

VSCode自定义代码片段14——Vue的axios网络请求封装