最近苹果更新的IOS8 对以前进行了很大的修改, 更新的API也让人捉急,据说iOS 8的新特性之一就是让接口更有适应性、更灵活,因此许多视图控制器的实现方式发生了巨大的变化。比如全新的UIPresentationController在实现视图控制器间的过渡动画效果和自适应设备尺寸变化效果(比如说旋转)中发挥了重要的作用,它有效地节省了程序员们的工作量。但是同时某些旧的UIKit控件也同样发生了许多变化,很多自定义在旧控件上的控件发生了诡异的BUG,其实UIAlertView、UIActionSheet (以及它们各自的 delegate protocols) 在 iOS 8 中已经被废弃了,在你的代码中按住点击 UIAlertView 或者 UIActionSheet,你就会看到最上面的注释:UIAlertView is deprecated. Use UIAlertController with a preferredStyle of UIAlertControllerStyleAlert instead.虽然类已经被废弃了,但在 @availability 属性中并没有表达出这一点。UIAlertView 目前还是能用的。更新不可怕,学会了就可以拿来用了.本文将会对Alert Views和Action Sheets发生的改变进行一个大致的介绍.

UIAlertView

随着苹果上次iOS 5的发布,UIAlertView 充满了无底线的让步,牺牲格式和设计正确性来顺应开发者的喜好。UIAlertView警告框就一直被大量使用,简单易用,应用场景巨大,一般使用时候常伴随两个按键,确定&取消.比如:

UIAlertView *alertview = [[UIAlertView alloc] initWithTitle:@"标题" message:@"这个是UIAlertView的默认样式" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"好的", nil];
[alertview show];

您也可以通过更改UIAlertView的alertViewStyle属性来实现输入文字、密码甚至登录框的效果。UIAlertViewDelegate协议拥有响应对话框视图的按钮动作的回调方法。还有当文本框内容改变时,调用alertViewShouldEnableOtherButton:方法可以让按钮动态地可用或者不可用。

说了这么多其实都没什么用,因为在IOS8.0之后 ,苹果已经不建议我们用UIAlertView了,而是新的UIAlertController

UIAlertController

UIAlertController 同时替代了 UIAlertView 和 UIActionSheet,从系统层级上统一了 alert 的概念 —— 即以 modal 方式或 popover 方式展示。

UIAlertController 是 UIViewController 的子类,而非其先前的方式。因此新的 alert 可以由 view controller 展示相关的配置中获益很多。

UIAlertController 不管是要用 alert 还是 action sheet 方式展示,都要以 title 和 message 参数来初始化。Alert 会在当前显示的 view controller 中心以模态形式出现,action sheet 则会在底部滑出。Alert 可以同时有按钮和输入框,action sheet 仅支持按钮。

新的方式并没有把所有的 alert 按钮配置都放在初始化函数中,而是引入了一个新类 UIAlertAction 的对象,在初始化之后可以进行配置。这种形式的 API 重构让对按钮数量、类型、顺序方便有了更大的控制。同时也弃用了 UIAlertView 和 UIActionSheet 使用的delegate 这种方式,而是采用更简便的完成时回调。

<span style="color:#33cc00;"><strong>// 注意这里的</strong></span><span style="font-family: 'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;"><span style="color:#33cc00;"><strong>preferredStyle的参数是一个枚举值 <span style="color: rgb(51, 204, 0); font-family: Menlo;font-size:18px; line-height: 28px; white-space: pre; ">UIAlertControllerStyleActionSheet 就是原UIActionSheet</span></strong></span></span><p style="margin-top: 0px; margin-bottom: 0px; font-family: Menlo;"></p><p style="margin-top: 0px; margin-bottom: 0px; font-family: Menlo;"><span style="color:#33cc00;">typedef NS_ENUM(NSInteger, UIAlertControllerStyle) {</span></p><p style="margin-top: 0px; margin-bottom: 0px; font-family: Menlo;"><span style="color:#33cc00;">    UIAlertControllerStyleActionSheet = 0,</span></p><p style="margin-top: 0px; margin-bottom: 0px; font-family: Menlo;"><span style="color:#33cc00;">    UIAlertControllerStyleAlert</span></p><p style="margin-top: 0px; margin-bottom: 0px; font-family: Menlo;"><span style="color:#33cc00;">} NS_ENUM_AVAILABLE_IOS(8_0);</span></p>
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"标题" message:@"<span style="font-family: 'Helvetica Neue', Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;">message</span>" preferredStyle:UIAlertControllerStyleAlert]; 
<pre name="code" class="objc"><span style="color:#33cc00;"><strong>// 注意这里的style参数是按钮样式,也是枚举值分别为:</strong></span>
</pre><pre name="code" class="objc" style="color: rgb(255, 102, 0);">UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];
UIAlertAction *sureAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil];
[alertController addAction:cancelAction];
[alertController addAction:sureAction];

还没有完事,因为现在警告框已经从一个View"进化"为一个Controller,所以显示方式也不再是show或者showIn ,而是

[self presentViewController:self.alertController animated:YES completion:nil];

注意,在试验时一定不要放在

-(void)viewDidLoad

方法里,(提示一下)可以写在视图出现或者自定义一个Button的触发方法里.

viewDidLoad

viewDidLoad

IOS开发之IOS8.0最新UIAlertController的更多相关文章

  1. IOS开发之IOS8.0最新UIAlertController 分类: ios技术 2015-01-20 14:24 144人阅读 评论(1) 收藏

    最近苹果更新的IOS8 对以前进行了很大的修改, 更新的API也让人捉急,据说iOS 8的新特性之一就是让接口更有适应性.更灵活,因此许多视图控制器的实现方式发生了巨大的变化.比如全新的UIPrese ...

  2. iOS开发之 XCode6.0的iOS免证书真机测试方法(MAC及黑苹果均有效)

    参考:http://mobile.51cto.com/iphone-455500.htm XCode6.0的iOS免证书真机测试方法(MAC及黑苹果均有效) 前提:设备已经越狱 目前在XCode上开发 ...

  3. iOS开发之WKWebView简单使用

    iOS开发之WKWebView简单使用   iOS开发之 WKWebVeiw使用 想用UIWebVeiw做的,但是突然想起来在iOS8中出了一个新的WKWebView,算是UIWebVeiw的升级版. ...

  4. 李洪强iOS开发之iOS好文章收集

    李洪强iOS开发之iOS好文章收集 该文收集朋友们转发或自己的写的技术文章,如果你也有相关的好文章,欢迎留言,当好文章多的时候,我会对这些好文章进行分门别类 文章 简述 日期 直播服务配置 使用 ng ...

  5. iOS 开发之 GCD 不同场景使用

    header{font-size:1em;padding-top:1.5em;padding-bottom:1.5em} .markdown-body{overflow:hidden} .markdo ...

  6. iOS开发之Socket通信实战--Request请求数据包编码模块

    实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...

  7. iOS开发之UISearchBar初探

    iOS开发之UISearchBar初探 UISearchBar也是iOS开发常用控件之一,点进去看看里面的属性barStyle.text.placeholder等等.但是这些属性显然不足矣满足我们的开 ...

  8. iOS开发之UIImage等比缩放

    iOS开发之UIImage等比缩放 评论功能真不错 评论开通后,果然有很多人吐槽.谢谢大家的支持和关爱,如果有做的不到的地方,还请海涵.毕竟我一个人的力量是有限的,我会尽自己最大的努力大家准备一些干货 ...

  9. iOS开发之loadView、viewDidLoad及viewDidUnload的关系

    iOS开发之loadView.viewDidLoad及viewDidUnload的关系 iOS开发之loadView.viewDidLoad及viewDidUnload的关系    标题中所说的3个方 ...

随机推荐

  1. Android 使用存放在存assets文件夹下的SQLite数据库

    因为这次的项目需要自带数据,所以就就把数据都放到一个SQLite的数据库文件中了,之后把该文件放到了assets文件夹下面.一开始打算每次都从assets文件夹下面把该文件夹拷贝到手机的SD卡或者手机 ...

  2. android之相机开发

     http://blog.csdn.net/jason0539/article/details/10125017 android之相机开发 分类: android 基础知识2013-08-20 22: ...

  3. php cookies自动登录

    <?php header('Content-type: text/html; charset=utf-8'); error_reporting(0); //自动登陆 if($_COOKIE[&q ...

  4. 隐式intent启动电子邮件,不需要非电子邮件应用程序。

    Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setType("text/plain"); intent.put ...

  5. [转]解决LinearLayout中控件不能居右对齐

    在LinearLayout布局时使用右对齐(android:layout_gravity="right")控件对齐方式不生效,需要设置 android:layout_weight= ...

  6. 高性能IO模型浅析(转)

    转自:http://www.cnblogs.com/fanzhidongyzby/p/4098546.html 是我目前看到的解释IO模型最清晰的文章,当然啦,如果想要详细的进一步了解还是继续啃蓝宝书 ...

  7. Linux系统编程读书笔记

    文件I/O模型 Linux的哲学思想,一切皆文件,这也是Linux文件操作的方便之处.系统调用不会分配缓冲区用以返回信息给调用者.所以必须提前分配大小合适的缓冲区并将缓冲区指针传递给系统调用. 1.o ...

  8. js实现类似于add(1)(2)(3)调用方式的方法

    群里有人说实现类似add(1)(2)(3)调用方式的方法,结果马上有人回答: var add = function(a){ return function(b){ return function(c) ...

  9. java dom4j解析xml实例(3)

    代码运行前需要先导入dom4j架包. 需要解析的XML文件test.xml如下: <students> <student age="25"><!--如 ...

  10. 设置DIV根据内容自动调整高度的三个方法

    Div即父容器在Firefox.Chrome.Safari中不会根据内容自动调节高度,我们看下面的HTML代码: <divid="main"><divid=&qu ...