iOS学习——UIAlertController详解
在开发中,弹出提示框是必不可少的。这两天项目中统一对已经被iOS API废弃的UIAlertView和UIActionSheet进行替换,我们知道,UIAlertView和UIActionSheet都已经被iOS的API所废弃了。在两者的API中都建议用UIAlertController替代,并通过设置不同的类型风格来选择是原先的UIAlertView或UIActionSheet的形式。
之前项目中一直用的都是原先的UIAlertView和UIActionSheet风格,所以对UIAlertController的了解很少,这次也借着这次统一项目更新的机会对UIAlertController进行了一番学习和研究。UIAlertController是在iOS8.0中出现的一种统一的提示风格的界面,代替原来的UIAlertView和UIActionSheet两种类别。iOS中学习一个新知识最简单便捷的两种方法,一是看官网API,二是看应用示例代码。下面,我们也从这两个方面来学习一下UIAlertController。
一 UIAlertController的学习
UIAlertController的API很简单,其官网API戳这里。关于UIAlertController的API也非常简单,所有内容如下图所示。从图中我们可以看到UIAlertController的内容主要分为五个部分:创建对象、配置UIAlertController对象的属性、配置UIAlertController上面的按钮、配置UIAlertController上面的文本框、常量。下面,我们结合实例对这些方法和常量进行学习。

UIAlertController提示器的使用分为三步,创建UIAlertController提示器对象-->配置UIAlertController提示器上的按钮-->显示UIAlertController提示器。
1.1 UIAlertController提示器对象的创建
UIAlertController提示器的创建主要是通过类方法来进行创建的,其中第一个参数是标题,第二个参数是内容信息,第三个参数UIAlertControllerStyle则是选择所创建的UIAlertController对象的类型是UIAlertView 还是 UIActionSheet。UIAlertControllerStyle是一个枚举类型,其定义就是在UIAlertController.h文件中。
+ (instancetype)alertControllerWithTitle:(NSString *)title message:(NSString *)message preferredStyle:(UIAlertControllerStyle)preferredStyle;
typedef NS_ENUM(NSInteger, UIAlertControllerStyle) {
UIAlertControllerStyleActionSheet = ,
UIAlertControllerStyleAlert
} NS_ENUM_AVAILABLE_IOS(8_0);
创建常用代码如下:
//UIAlertView风格
UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"My Alert"
message:@"This is an alert."
preferredStyle:UIAlertControllerStyleAlert]; //UIActionSheet风格
UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"My Alert"
message:@"This is an alert."
preferredStyle:UIAlertControllerStyleActionSheet];
1.2 UIAlertController提示器的配置
在UIAlertController提示器中,我们常用的配置有两类,一是根据需要添加按钮,并味蕾个按钮添加点击事件;二是根据需要添加文本框,用于和用户进行更多的交互。
1.2.1 UIAlertController上添加按钮
UIAlertController上的每一个按钮都是一个UIAlertAction,与UIAlertController的类型是UIAlertView 还是 UIActionSheet无关。UIAlertAction的定义也是就在UIAlertController.h文件中,如下。我们需要在UIAlertController提示器添加一个按钮时,先创建一个UIAlertAction,然后通过UIAlertController的 addAction: 方法将创建的UIAlertAction对象添加就OK了。
NS_CLASS_AVAILABLE_IOS(8_0) @interface UIAlertAction : NSObject <NSCopying> + (instancetype)actionWithTitle:(nullable NSString *)title style:(UIAlertActionStyle)style handler:(void (^ __nullable)(UIAlertAction *action))handler; @property (nullable, nonatomic, readonly) NSString *title;
@property (nonatomic, readonly) UIAlertActionStyle style;
@property (nonatomic, getter=isEnabled) BOOL enabled; @end
创建UIAlertAction对象直接用UIAlertAction的类方法就可以创建了,其中第一个参数是按钮的标题;第二个参数UIAlertActionStyle是选择按钮的风格类型,有三种选择:常规、取消和销毁风格类型;第三个参数是一个Block,定义了按钮的点击响应事件。
+ (instancetype)actionWithTitle:(nullable NSString *)title style:(UIAlertActionStyle)style handler:(void (^ __nullable)(UIAlertAction *action))handler;
UIAlertActionStyle是一个枚举类型,其定义也是在UIAlertController.h文件中。
typedef NS_ENUM(NSInteger, UIAlertActionStyle) {
UIAlertActionStyleDefault = , //常规类型,默认蓝色字体
UIAlertActionStyleCancel, //取消类型,默认蓝色字体
UIAlertActionStyleDestructive //销毁类型,默认红色字体,表示可能是要删除信息
} NS_ENUM_AVAILABLE_IOS(8_0);
常规用法示例如下:
//创建对象
UIAlertController *alert = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet]; //添加销毁按钮
UIAlertAction* destructiveBtn = [UIAlertAction actionWithTitle:@"销毁按钮" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * action) {
NSLog(@"UIAlertActionStyleDestructive");
}];
[alert addAction: destructiveBtn]; //添加默认按钮
UIAlertAction* defaultBtn = [UIAlertAction actionWithTitle:@"常规按钮" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {
NSLog(@"UIAlertActionStyleDefault");
}];
[alert addAction:albumBtn]; //添加取消按钮
UIAlertAction* cancelBtn = [UIAlertAction actionWithTitle:@"取消按钮" style:UIAlertActionStyleCancel handler:^(UIAlertAction * action) {
NSLog(@"UIAlertActionStyleCancel");
}];
[alert addAction:cancelBtn];
1.2.2 UIAlertController上添加文本框
上面我们讲到了如何在UIAlertController提示器上添加按钮,但是有时候,我们需要在提示器上添加一个或多个文本框让用户填写一些信息,在UIAlertController中也提供了一个方法直接可以在提示器上添加文本框。只有一个参数,就是一个Block,用于我们队该文本框进行配置,比喻说其字体大小,行数限制等等,都可以在该Block中进行设置。
- (void)addTextFieldWithConfigurationHandler:(void (^)(UITextField *textField))configurationHandler;
常见用法示例如下:
[alert addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
NSLog(@"添加一个textField就会调用 这个block");
}];
但是,值得注意的有两点:
- 文本框的添加只能是在UIAlertController的风格类型为UIAlertView时才有
- 文本框的添加多个
我们可以看到,在配置文本框这里还有一个参数是textFields,这各参数是一个只读数组类型,用于获取UIAlertController提示器上所有的文本框对象,这个经常在我们点击按钮时用这个来获取到每一个文本框,并取得用户填写的信息。
@property(nonatomic, readonly) NSArray<UITextField *> *textFields;
常见用法如下:
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"title" message:@"message" preferredStyle:UIAlertControllerStyleAlert];
//添加文本框
[alert addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
//设置键盘输入为数字键盘
textField.keyboardType = UIKeyboardTypeNumberPad;
textField.placeholder = @"请填写";
}]; UIAlertAction *cancelBtn = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
//取消
}];
[alert addAction: cancelBtn]; //添加确定按钮
UIAlertAction *confirmBtn = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
//文本框结束编辑,收起键盘
[[alertVC.textFields firstObject] endEditing:YES];
NSLog(@"%@", [alert.textFields firstObject].text);
//获取文本框填写的内容
NSString *meetingId = [alertVC.textFields firstObject].text.trim;
if(meetingId.length > ){
[weakSelf showHUDWithText:@"会议号过长"];
}else{
[weakSelf enterVideoMeeting:meetingId];
}
}];
[alert addAction: confirmBtn];
1.3 UIAlertController提示器的显示
UIAlertController提示器的显示则很简单,从提示器的类名UIAlertController可以看出,提示器是一个viewController,因此,要显示提示器,我们一般是是当前viewController的 presentViewController: animated: completion: 方法进行推出,我们创建的提示器。
[self presentViewController:alert animated:YES completion:nil];
1.4 UIAlertController提示器的使用
常规使用示例:
//创建对象
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"显示的标题" message:@"标题的提示信息" preferredStyle:UIAlertControllerStyleAlert]; //添加取消类型按钮
[alertController addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
NSLog(@"点击取消");
}]]; //添加常规类型按钮
[alertController addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
NSLog(@"点击确认");
}]]; //添加销毁类型按钮
[alertController addAction:[UIAlertAction actionWithTitle:@"警告" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {
NSLog(@"点击警告");
}]]; //添加文本框
[alertController addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
NSLog(@"添加一个textField就会调用 这个block");
}]; //显示
[self presentViewController:alertController animated:YES completion:nil];
运行的效果图如下图所示,左边是UIAlertView类型的效果图,右边是UIActionSheet类型的效果图。

二 UIAlertController中自定义
在一般情况下,我们只要弹出系统自带的弹出框就可以。but,在某些情况下,万恶的UI会要求你修改显示文字的大小、颜色,虽然系统自带有一种红色字体的UIAlertAction,但是这种Action并不能放在Cancel位置,所以,更多时候,需要我们自己修改文字字体和颜色。可是在公开的API接口中好像并没有对应的方法,那么我们应该怎么做呢?主要的方法有两种:
- 利用第三方控件
- 利用KVC方法进行自定义修改
2.1 利用第三方控件进行UIAlertController属性的自定义
现在Github上有着众多的Alert控件(如SCLAlertView等),相信有很多都可以满足大家的需求,只要使用Cocoapods添加添加第三方库就可以了。在这里我们就不详细进行介绍了。
2.2 利用KVC方法进行UIAlertController属性的自定义
有时候使用第三方控件会带来很多不必要的代码量和bug,所以能用系统自带的UIAlertController解决是最好的办法,这样当然也是可以的。苹果公司并没有完全的封死对UIAlertController的定制,而是修改为使用KVC的方法进行定制。如果要自定义标题和内容,可以通过NSAttributedString把字体和颜色设置好,然后在通过KVC的方法进行设置,就可以了。
- (void) test{
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"提示" message:@"提示内容" preferredStyle:UIAlertControllerStyleAlert];
// UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"提示" message:@"提示内容" preferredStyle:UIAlertControllerStyleActionSheet];
//修改title
NSMutableAttributedString *alertControllerStr = [[NSMutableAttributedString alloc] initWithString:@"提示"];
[alertControllerStr addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(, )];
[alertControllerStr addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:] range:NSMakeRange(, )];
[alertController setValue:alertControllerStr forKey:@"attributedTitle"];
//修改message
NSMutableAttributedString *alertControllerMessageStr = [[NSMutableAttributedString alloc] initWithString:@"提示内容"];
[alertControllerMessageStr addAttribute:NSForegroundColorAttributeName value:[UIColor greenColor] range:NSMakeRange(, )];
[alertControllerMessageStr addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:] range:NSMakeRange(, )];
[alertController setValue:alertControllerMessageStr forKey:@"attributedMessage"];
//常规按钮
UIAlertAction *defaultAction = [UIAlertAction actionWithTitle:@"Default" style:UIAlertActionStyleDefault handler:nil];
//销毁按钮
UIAlertAction *destructiveAction = [UIAlertAction actionWithTitle:@"Destructive" style:UIAlertActionStyleDestructive handler:nil];
//取消按钮
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil];
[alertController addAction:defaultAction];
[alertController addAction:destructiveAction];
[alertController addAction:cancelAction];
[self presentViewController:alertController animated:YES completion:nil];
}
效果如下图所示:

除了可以修改提示器的标题和内容信息的颜色和字号,我们还可以修改按钮控件的颜色和字号,具体方法如下:
//修改按钮
if (cancelAction valueForKey:@"titleTextColor") {
[cancelAction setValue:[UIColor redColor] forKey:@"titleTextColor"];
}
效果图如下图所示:

iOS学习——UIAlertController详解的更多相关文章
- iOS学习之详解AppDelegate
AppDelegate, 类似于监听接口. 用个很简单的例子说:ios系统会控制每个程序的开始和结束.但是ios又不知道每个程序的开始需要运行成么代码,结束需要运行什么代码.这个时候,ios就制定了一 ...
- iOS中-Qutarz2D详解及使用
在iOS中Qutarz2D 详解及使用 (一)初识 介绍 Quartz 2D是二维绘图引擎. 能完成的工作有: 绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 绘制\生成图片(图像) 读取\生成 ...
- iOS应用开发详解
<iOS应用开发详解> 基本信息 作者: 郭宏志 出版社:电子工业出版社 ISBN:9787121207075 上架时间:2013-6-28 出版日期:2013 年7月 开本:16开 ...
- 了解iOS消息推送一文就够:史上最全iOS Push技术详解
本文作者:陈裕发, 腾讯系统测试工程师,由腾讯WeTest整理发表. 1.引言 开发iOS系统中的Push推送,通常有以下3种情况: 1)在线Push:比如QQ.微信等IM界面处于前台时,聊天消息和指 ...
- iPhone应用开发 UITableView学习点滴详解
iPhone应用开发 UITableView学习点滴详解是本文要介绍的内容,内容不多,主要是以代码实现UITableView的学习点滴,我们来看内容. -.建立 UITableView DataTab ...
- 转载]IOS LBS功能详解[0](获取经纬度)[1](获取当前地理位置文本 )
原文地址:IOS LBS功能详解[0](获取经纬度)[1](获取当前地理位置文本作者:佐佐木小次郎 因为最近项目上要用有关LBS的功能.于是我便做一下预研. 一般说来LBS功能一般分为两块:一块是地理 ...
- iOS 2D绘图详解(Quartz 2D)之路径(点,直线,虚线,曲线,圆弧,椭圆,矩形)
前言:一个路径可以包含由一个或者多个shape以及子路径subpath,quartz提供了很多方便的shape可以直接调用.例如:point,line,Arc(圆弧),Curves(曲线),Ellip ...
- iOS开发——Block详解
iOS开发--Block详解 1. Block是什么 代码块 匿名函数 闭包--能够读取其他函数内部变量的函数 函数变量 实现基于指针和函数指针 实现回调的机制 Block是一个非常有特色的语法,它可 ...
- iOS开发:详解Objective-C runTime
Objective-C总Runtime的那点事儿(一)消息机制 最近在找工作,Objective-C中的Runtime是经常被问到的一个问题,几乎是面试大公司必问的一个问题.当然还有一些其他问题也几乎 ...
随机推荐
- C3P0 APPARENT DEADLOCK
一,c3p0执行一段时间后报错例如以下 W 07-26_00:58:27 ThreadPoolAsynchronousRunner.java 608 com.mchange.v2.async.Thre ...
- poj 1860 Currency Exchange (SPFA、正权回路 bellman-ford)
链接:poj 1860 题意:给定n中货币.以及它们之间的税率.A货币转化为B货币的公式为 B=(V-Cab)*Rab,当中V为A的货币量, 求货币S通过若干此转换,再转换为原本的货币时是否会添加 分 ...
- 自学Python1.1-简介
1.python语言介绍 python的创始人:Guido Van Rossum 2.python是一门什么样的语言 2.1 编程语言主要从以下几个角度进行分类:编译型,静态型,动态性,强类型定义语 ...
- ERROR: Java 1.7 or later is required to run Apache Drill.
问题 Apache 的 drill 执行启动命令 drill-embedded 报错: ERROR: Java 1.7 or later is required to run Apache Drill ...
- JavaScript基础5——关于ECMAscript的函数
ECMAScript的函数概述(一般定义到<head>标签之间) (1)定义函数,JavaScript一般有三种定义函数方法: *第一种是使用function语句定义函数(静态方法) fu ...
- js登录滑动验证,不滑动无法登陆
js的判断这里是根据滑块的位置进行判断,应该是用一个flag判断 <%@ page language="java" contentType="text/html; ...
- linux集群批量执行命令
因为工作需要,需要修改集群中机器的配置,一台一台的修改太浪费时间,就想能不能通过自动化脚本批量执行命令,尝试写一个,自己shell不熟悉,写的有点渣渣 if [ "$#" -ne ...
- ArcGIS API for JavaScript 4.2学习笔记[19] 搜索小部件——使用更多数据源
上一篇中提到,空间搜索小部件是Search这个类的实例化,作为视图的ui属性添加进去后,视图就会出现搜索框了. 这节的主体代码和上篇几乎一致,区别就在上篇提及的sources属性. 先看看结果: 由于 ...
- bzoj 2726: [SDOI2012]任务安排
Description 机 器上有N个需要处理的任务,它们构成了一个序列.这些任务被标号为1到N,因此序列的排列为1,2,3...N.这N个任务被分成若干批,每批包含相邻的 若干任务.从时刻0开始,这 ...
- sort 命令详解
sort 作用:将文本文件内容加以排序,sort可针对文本文件的内容,以行为单位来排序 参数: -b 忽略每行前面开始出的空格字符. -c 检查文件是否已经按照顺序排序. -d 排序时,处理英文字 ...