IOS开发之IOS8.0最新UIAlertController

最近苹果更新的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

时间: 2024-11-05 11:39:45

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

iOS开发之iOS6.0\iOS7.0\iOS8.0的UIAlertView message 文字对齐设置

是不是发现原来这段代码: #pragma mark - #pragma mark - alert delegate - (void) willPresentAlertView:(UIAlertView *)alertView { for (UIView *subViewin alertView.subviews) { UILabel *tmpLabel = (UILabel *)subView; tmpLabel.textAlignment =NSTextAlignmentLeft; } } 在

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

参考:http://mobile.51cto.com/iphone-455500.htm XCode6.0的iOS免证书真机测试方法(MAC及黑苹果均有效) 前提:设备已经越狱 目前在XCode上开发的iOS程序只能在模拟器Simulator中运行,如果要放到真机上测试,需要苹果官方认证的开发者账号,购买开发者证书iDP,99美金一年啊! 目前在XCode上开发的iOS程序只能在模拟器Simulator中运行,如果要放到真机上测试,需要苹果官方认证的开发者账号,购买开发者证书iDP,99美金一年

iOS开发之WKWebView简单使用和常用使用场景

iOS开发之 WKWebVeiw使用 想用UIWebVeiw做的,但是突然想起来在iOS8中出了一个新的WKWebView,算是UIWebVeiw的升级版.本着对新事物的好奇,就上网查了一下,但是找了好多个都没说的多了详细,于是就问谷歌,找文档,看看使用方法,试用了一下,果然不错,记录下来,大家分享! WKWebView的特点: 性能高,稳定性好,占用的内存比较小, 支持JS交互 支持HTML5 新特性 可以添加进度条(然并卵,不好用,还是习惯第三方的). 支持内建手势, 据说高达60fps的刷

iOS开发之Auto Layout入门

随着iPhone6与iOS8的临近,适配的问题讲更加复杂,最近学习了一下Auto Layout的使用,与大家分享.  什么是Auto Layout? Auto Layout是iOS6发布后引入的一个全新的布局特性,其目的是弥补以往Autoresizing在布局方面的不足之处,以及未来面对更多尺寸适配时界面布局可以更好的适应. 为什么要用Auto Layout? Autolayout能解决不同屏幕(iPhone4,iPhone5,iPad...)之间的适配问题. 在iPhone4时代开发者只需要适

iOS开发之MVVM在项目中的应用

今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦~). 由于本人项目经验有限,关于架构设计方面的东西理解有限,我个人对MVVM的理解主要是借鉴于之前的用过的MVC的Web框架~在学校的时候用过ThinkPHP框架,和SSH框架,都是MVC的架构模式,今天MVVM与传统的MVC可谓是极为相似,也可以说是兄弟关系,也就是一家人了. 说到架构设计和团队

iOS 开发之Widget的开发及使用(下)

在iOS 开发之Widget的开发及使用(上)中都交代清楚了关于widget扩展的添加,以及布局部分的内容,下面说下关键部分:关于数据共享的操作. 在Apple发布iOS8.0以后,对App有提供一个新的扩展选择项,叫做App groups,选择宿主Target之后,在capabilities选项卡下面会找到这个选项: 那么这个选项主要是做何使用呢? iOS系统,每个开发应该都清楚,其内部程序都是遵循沙盒机制,App与App之间,是不能进行数据共享的,A 不能访问 B 的数据,同样 B 也不能访

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

李洪强iOS开发之iOS好文章收集 该文收集朋友们转发或自己的写的技术文章,如果你也有相关的好文章,欢迎留言,当好文章多的时候,我会对这些好文章进行分门别类 文章 简述 日期 直播服务配置 使用 nginx 和 rtmp 插件搭建视频直播和点播服务器 2015-05-12 20:13:00 iOS9适配技巧 图iOS9适配新技巧 2015-09-29 09:01 TextKit分页效果 图文混排 2015年6月1日 iPhone 6 / 6 Plus 设计·适配方案 屏幕适配 2014-11-2

IOS开发之copy的问题

copy的目的就是修改副本,修改原始对象和副本时不会产生干扰. 定义一个不可变属性A,再定义一个可变属性B.用B做添加删除等操作后再将B赋值给A时,有些人习惯用A = B:其实这样是不安全的. 假设有下面的一段代码: ? 1 2 3 4 5 6 7 8 9 10   int main() {    NSMutableString *strM = [NSMutableString [email protected]"123"];    NSString *str = strM;    N

iOS开发之CocoaPods的使用

透明色:00ff00ff //设置柱状图的颜色                ColorSet cs = new ColorSet();                cs.Id = "colorset1"; #region 设置柱状图的颜色 待开发                    string strColor = oYAXIS.Color;                    switch (strColor)                    {