UIAlertController 的使用
IAlertController 同时替代了 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 这种方式,而是采用更简便的完成时回调。
新旧 Alert 方式对比
标准的 Alert 样式

旧方法:UIAlertView
|
1
2
3
|
let alertView = UIAlertView(title: "Default Style", message: "A standard alert.", delegate: self, cancelButtonTitle: "Cancel", otherButtonTitles: "OK")alertView.alertViewStyle = .DefaultalertView.show() |
|
1
2
3
4
5
6
|
// MARK: UIAlertViewDelegatefunc alertView(alertView: UIAlertView, clickedButtonAtIndex buttonIndex: Int) { switch buttonIndex { // ... }} |
新方法:UIAlertController
|
1
2
3
4
5
6
7
8
9
10
11
12
|
let alertController = UIAlertController(title: "Default Style", message: "A standard alert.", preferredStyle: .Alert)let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel) { (action) in // ...}alertController.addAction(cancelAction)let OKAction = UIAlertAction(title: "OK", style: .Default) { (action) in // ...}alertController.addAction(OKAction)self.presentViewController(alertController, animated: true) { // ...} |
标准的 Action Sheet 样式

UIActionSheet
|
1
2
3
|
let actionSheet = UIActionSheet(title: "Takes the appearance of the bottom bar if specified; otherwise, same as UIActionSheetStyleDefault.", delegate: self, cancelButtonTitle: "Cancel", destructiveButtonTitle: "Destroy", otherButtonTitles: "OK")actionSheet.actionSheetStyle = .DefaultactionSheet.showInView(self.view) |
|
1
2
3
4
5
6
|
// MARK: UIActionSheetDelegatefunc actionSheet(actionSheet: UIActionSheet, clickedButtonAtIndex buttonIndex: Int) { switch buttonIndex { ... }} |
UIAlertController
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
let alertController = UIAlertController(title: nil, message: "Takes the appearance of the bottom bar if specified; otherwise, same as UIActionSheetStyleDefault.", preferredStyle: .ActionSheet)let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel) { (action) in // ...}alertController.addAction(cancelAction)let OKAction = UIAlertAction(title: "OK", style: .Default) { (action) in // ...}alertController.addAction(OKAction)let destroyAction = UIAlertAction(title: "Destroy", style: .Destructive) { (action) in println(action)}alertController.addAction(destroyAction)self.presentViewController(alertController, animated: true) { // ...} |
新功能
UIAlertController 并不只是对已有的 API 做了清理,而是进行了标准化归纳。以前,预设的样式闲置有很多(swizzling 虽然可以提供更多的功能但还是有很大风险)。UIAlertController 让以前看起来很神奇的事情变为了可能。
UIAlertController is not just a cleanup of pre-existing APIs, it's a generalization of them. Previously, one was constrained to whatever presets were provided (swizzling in additional functionality at their own risk). With UIAlertController, it's possible to do a lot more out-of-the-box:
带有警示按钮的 Alert

这种行为已经被 UIAlertActionStyle 所涵盖,共有三种类型:
.Default: 对按钮应用标准样式。
.Cancel: 对按钮应用取消样式,代表取消操作不做任何改变。
.Destructive: 对按钮应用警示性的样式,提示用户这样做可能会改变或删除某些数据。
所以想要对模态的 alert 加一个警示性的按钮,只需要加上 .Destructive 风格的 UIAlertAction 属性:
|
1
2
3
4
5
6
7
8
9
10
11
12
|
let alertController = UIAlertController(title: "Title", message: "Message", preferredStyle: .Alert)let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel) { (action) in println(action)}alertController.addAction(cancelAction)let destroyAction = UIAlertAction(title: "Destroy", style: .Destructive) { (action) in println(action)}alertController.addAction(destroyAction)self.presentViewController(alertController, animated: true) { // ...} |
大于 2 个按钮的 Alert

有 1 个或者 2 个操作的时候,按钮会水平排布。更多按钮的情况,就会像 action sheet 那样展示:
|
1
2
3
4
5
6
7
8
|
let oneAction = UIAlertAction(title: "One", style: .Default) { (_) in }let twoAction = UIAlertAction(title: "Two", style: .Default) { (_) in }let threeAction = UIAlertAction(title: "Three", style: .Default) { (_) in }let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel) { (_) in }alertController.addAction(oneAction)alertController.addAction(twoAction)alertController.addAction(threeAction)alertController.addAction(cancelAction) |
创建登录表单

iOS 5 就为 UIAlertView 加入了 alertViewStyle 属性,将原本私有的 API 暴露出来给开发者使用 —— 像某些系统内建应用一样允许在 alert 中显示登录和密码框。
在 iOS 8 中,UIAlertController 则加入了 addTextFieldWithConfigurationHandler 方法:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
let loginAction = UIAlertAction(title: "Login", style: .Default) { (_) in let loginTextField = alertController.textFields![0] as UITextField let passwordTextField = alertController.textFields![1] as UITextField login(loginTextField.text, passwordTextField.text)}loginAction.enabled = falselet forgotPasswordAction = UIAlertAction(title: "Forgot Password", style: .Destructive) { (_) in }let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel) { (_) in }alertController.addTextFieldWithConfigurationHandler { (textField) in textField.placeholder = "Login" NSNotificationCenter.defaultCenter().addObserverForName(UITextFieldTextDidChangeNotification, object: textField, queue: NSOperationQueue.mainQueue()) { (notification) in loginAction.enabled = textField.text != "" }}alertController.addTextFieldWithConfigurationHandler { (textField) in textField.placeholder = "Password" textField.secureTextEntry = true}alertController.addAction(loginAction)alertController.addAction(forgotPasswordAction)alertController.addAction(cancelAction) |
创建注册表单

UIAlertController 想得比以前更周到一些,它提供了展示无限个输入框的权限,并且每一个输入框都可以根据需求进行自定义。这让仅在一个模态的 alert 中实现完善的注册功能成为可能:
|
1
2
3
4
5
6
7
8
9
10
11
12
|
alertController.addTextFieldWithConfigurationHandler { (textField) in textField.placeholder = "Email" textField.keyboardType = .EmailAddress}alertController.addTextFieldWithConfigurationHandler { (textField) in textField.placeholder = "Password" textField.secureTextEntry = true}alertController.addTextFieldWithConfigurationHandler { (textField) in textField.placeholder = "Password Confirmation" textField.secureTextEntry = true} |
虽然有了这些,但必须要说明的是,不用矫枉过正。不能因为你可以这样做,就代表你应该这样做。忘了这玩意吧,提供一个 view controller 来做注册功能吧,因为你本就应该这样做!
注意
如果试图向 alert controller 添加带有 .ActionSheet 属性的输入框,将会抛出异常:
|
1
|
Terminating app due to uncaught exception NSInternalInconsistencyException, reason: 'Text fields can only be added to an alert controller of style UIAlertControllerStyleAlert' |
同样的,向 alert 或 action sheet 添加一个以上的 .Cancel 按钮将会抛出异常:
|
1
|
Terminating app due to uncaught exception NSInternalInconsistencyException, reason: ' |
UIAlertController 的使用的更多相关文章
- UIAlertController
楼主在整理项目的警告,于是乎你懂的. 然后自己整理了一下以后方便自己忘了之后能及时找到它 关于UIAlertController .h文件的解析 /** 关于UIAlertController的解析 ...
- iOS UIAlertController跟AlertView用法一样 && otherButtonTitles:(nullable NSString *)otherButtonTitles, ... 写法
今天写弹出框UIAlertController,用alertView习惯了,所以封装了一下,跟alertView用法一样,不说了,直接上代码: 先来了解一下otherButtonTitles:(nul ...
- UIAlertController使用
// 将UIAlertController模态出来 相当于UIAlertView show 的方法// 初始化一个一个UIAlertController // 参数preferredStyle: ...
- IOS UIAlertController 使用方法
在很多种语言中,alert都表示弹窗操作,弹窗功能非常有用,不仅可以用于正式的app功能中,也可以在调试中使用.在OC中,UIAlertController类用来控制弹窗操作.在IOS 8.0之前, ...
- UI控件(UIAlertController)
@implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; UIButton *_button = [UIBut ...
- UIAlertController 部分用法及属性
//创建UIAlertController:初始化UIAlertController 需要使用alertControllerWithTitle UIAlertController *alertCont ...
- iOS--UIAlertView与UIAlertController和UIAlertAction之间的事儿
iOS 8的新特性之一就是让接口更有适应性.更灵活,因此许多视图控制器的实现方式发生了巨大的变化.全新的UIPresentationController在实现视图控制器间的过渡动画效果和自适应设备 ...
- 开始使用 UIAlertController 吧
UIAlertView 与 UIActionSheet UIAlertView 样式 实现 - (void)showAlertView { self.alertView = [[UIAlertView ...
- UI第十四节——UIAlertController
- (void)viewDidLoad { [super viewDidLoad]; UIButton *alertBtn = [UIButton buttonWithType:U ...
- iOS 8.0后使用UIAlertController
iOS 8的新特性之一就是让接口更有适应性.更灵活,因此许多视图控制器的实现方式发生了巨大的变化.全新的UIPresentationController在实现视图控制器间的过渡动画效果和自适应设备尺寸 ...
随机推荐
- 获取iframe的元素并进行操作
获取iframe中的document元素有一下集中方法: 1.getElementById()方法和contentWindow属性: window.onload=function(){ /*必须等待页 ...
- javaScript入门第一天
JavaScript提供七种不同的data types(数据类型),它们是undefined(未定义), null(空), boolean(布尔型), string(字符串), symbol(符号), ...
- Codeforces 682D Alyona and Strings(DP)
题目大概说给两个字符串s和t,然后要求一个包含k个字符串的序列,而这个序列是两个字符串的公共子序列,问这个序列包含的字符串的总长最多是多少. 如果用DP解,考虑到问题的规模,自然这么表示状态: dp[ ...
- js库写法
前言: 现在javascript库特别多,其写法各式各样,总结几种我们经常见到的,作为自己知识的积累.而目前版本的 JavaScript 并未提供一种原生的.语言级别的模块化组织模式,而是将模块化的方 ...
- jqgrid动态显示/隐藏某一列
jQuery("#grid_id").setGridParam().showCol("colname").trigger("reloadGrid&qu ...
- BZOJ3567 : AABB
考虑以块大小为$32$将序列分块,设$s[i][j]$表示前$i$块和前$j$块矩形相交的对数,$f[i][j]$表示矩形$i$和前$j$块的相交个数. 如果矩形$i$和$j$相交,那么有: $x_1 ...
- <fieldset>
legend{text-align:center;} <fieldset> <legend>爱好<legend>(为fieldset定义标题) <input ...
- background常用属性
background-image:url('图片位置');//设置背景图片的位置 background-repeat:no-repeat;//图片是否重复显示(不重复) background-posi ...
- exp.validate.js
简单实用的js基础数据验证 prototype /// <reference path="/Scripts/expand-fn/exp_validate.js" /> ...
- JAVA生成带Logo的二维码
1.下载生成二维码所需要的jar包qrcode.jar: 2.直接上生成二维码的java代码 //需要导入的包 import java.awt.Color;import java.awt.Graphi ...