http://blog.csdn.net/xiaowenwen1010/article/details/40108097
iOS8新推出的UIAlertController究竟是为了什么?已有的UIActionSheet
和UIAlertView
就这样被打酱油了么?其实不然。。。
UIAlertController
是iOS8中新加入的一个ViewController,其主要功能是提醒(Alert),并取代UIActionSheet
和UIAlertView
向用户展示提醒消息。因为它是一个ViewController,所以可以用presentViewController:animated:completion:
方法来弹出它。
UIActionSheet
和UIAlertView
UIAlertController
采用block异步回调的形式来代理按钮的动作和文本框的配置,这样显得更加代码紧凑,可读性高。这样就不用通过协议代理给其他类,使得同一个逻辑下本应在一起的代码分离开。UIActionSheet
和UIAlertView
执行的都是提醒功能,只是展现的位置略有不同,合并相似功能并上升到Controller的级别,这是一种进步。UIAlertController
在添加按钮和文本框时更加灵活,而UIAlertView
只提供了四种Style,局限性太大。UIAlertController
在增加拓展性的基础上也限定了一些风格来进行约束,不过新增加的风格比UIAlertView
更贴合实际应用。 PS:其实最直接的原因就是博主想弹出个Alert,有俩文本框的(不要密码输入框),可惜UIAlertView
做不到啊!!!
UIAlertController
创建很简单有木有:
<span style="font-family:Microsoft YaHei;"><span class="line-number" style="margin: 0px; padding: 0px;">1</span> <span class="line-number" style="margin: 0px; padding: 0px;">2</span> <span class="line-number" style="margin: 0px; padding: 0px;">3</span> </span> |
|
举个栗子:
<span style="font-family:Microsoft YaHei;"><span class="line-number" style="margin: 0px; padding: 0px;">1</span> <span class="line-number" style="margin: 0px; padding: 0px;">2</span> <span class="line-number" style="margin: 0px; padding: 0px;">3</span> </span> |
|
title
和message
自然不用说了吧,需要注意的是preferredStyle
一旦设定好以后就不能改了哦,因为它就是区分UIAlertController
到底是对应着UIActionSheet
还是UIAlertView
,一共就这两种Style:
<span style="font-family:Microsoft YaHei;"><span class="line-number" style="margin: 0px; padding: 0px;">1</span> <span class="line-number" style="margin: 0px; padding: 0px;">2</span> <span class="line-number" style="margin: 0px; padding: 0px;">3</span> <span class="line-number" style="margin: 0px; padding: 0px;">4</span> </span> |
|
以前的做法是给个按钮标题数组然后在实现协议的代理方法中判断下按钮序列,然后对应给出不同的处理流程。分散的逻辑和代码无疑增加了开发者的工作量,还要求对应的类实现代理协议,真是out了。
这里介绍一个新的类:UIAlertAction,UIAlertController
弱化了以前添加Button的概念,而是添加UIAlertAction。其实说白了就是将按钮和处理方法捏到一起成为一个“动作”:
<span style="font-family:Microsoft YaHei;"><span class="line-number" style="margin: 0px; padding: 0px;">1</span> <span class="line-number" style="margin: 0px; padding: 0px;">2</span> <span class="line-number" style="margin: 0px; padding: 0px;">3</span> </span> |
|
title
就是按钮的文本内容;style
是按钮的风格,一共有三种风格:Default,Cancel和Destructive,其中Destructive会使按钮文字变成红色;handler
是处理按钮按下后的一个block,这段代码块与添加的按钮紧密结合成“动作”,最后通过addAction:
方法将UIAlertAction添加到UIAlertController
中:
<span style="font-family:Microsoft YaHei;"><span class="line-number" style="margin: 0px; padding: 0px;">1</span> <span class="line-number" style="margin: 0px; padding: 0px;">2</span> <span class="line-number" style="margin: 0px; padding: 0px;">3</span> <span class="line-number" style="margin: 0px; padding: 0px;">4</span> <span class="line-number" style="margin: 0px; padding: 0px;">5</span> </span> |
|
这也是最令博主激动的地方,最然不能自定义Alert中的内容,但起码添加UITextField不受限制了。添加文本框的方法实在是简洁:
<span style="font-family:Microsoft YaHei;"><span class="line-number" style="margin: 0px; padding: 0px;">1</span> </span> |
|
一个block就解决了!你只需要在block中配置下文本框的字体、键盘、代理等即可,举个栗子:
<span style="font-family:Microsoft YaHei;"><span class="line-number" style="margin: 0px; padding: 0px;">1</span> <span class="line-number" style="margin: 0px; padding: 0px;">2</span> <span class="line-number" style="margin: 0px; padding: 0px;">3</span> <span class="line-number" style="margin: 0px; padding: 0px;">4</span> <span class="line-number" style="margin: 0px; padding: 0px;">5</span> <span class="line-number" style="margin: 0px; padding: 0px;">6</span> </span> |
|
美中不足的是文本框的代理还需要在另外一个地方写代码来实现协议,这种历史遗留问题终将被block统统解决!
UIAlertController
的确是方便多了,无论是代码的简洁性还是可读性,都有了较大的提升。不过也有缺点,就是动用Controller的层级略显麻烦,尤其是使用presentViewController:animated:completion:
方法来弹出Alert界面与之前的一个潇洒的show
相比真是有些“霸气”。看个人喜好了,只要满足需求,咋方便咋用。
最后,贴上一张效果图: