博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UIAlertController 介绍
阅读量:5872 次
发布时间:2019-06-19

本文共 5645 字,大约阅读时间需要 18 分钟。

前言

你知道 UIAlertView、UIActionSheet (以及它们各自的 delegate protocols) 在 iOS 8 中已经被废弃了吗?

这是真的。在你的代码中按住 ⌘ 点击 UIAlertView 或者 UIActionSheet,你就会看到最上面的注释:

UIAlertView is deprecated. Use UIAlertController with a preferredStyle of UIAlertControllerStyleAlert instead.

最开始的时候,UIAlertView 充满了无底线的让步,牺牲格式和设计正确性来顺应开发者的喜好。它的 delegate 类型是在初始化函数中注释的 (delegate:(id / <UIAlertViewDelegate /)delegate),并且在 protocol 方法中实现了让人匪夷所思的概念——buttonAtIndex: 的 "clicked" 而不是 "tapped";然后还提供了不限数量的参数来引入 otherButtonTitles,因此 button 的索引管理变得非常痛苦;一个 -show 方法也根本不考虑 view 的层级关系......类似的问题数不胜数。

UIActionSheet 也一样糟糕,但是开发者大多数时间里都没时间想起那些糟糕的使用方法,与其相关的抱怨特就更少了。

因此,介绍 UIAlertController 给大家,就好比派出军队解放一座被占领的城市一样。它不仅仅改进了那些让人头疼的 API,也开辟了一条为最新设备上 UIKit 特性适配的新路径。


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 这种方式,而是采用更简便的完成时回调。

UIAlertController--UIAlertView

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) {    // ...}

UIAlertController--UIActionSheet

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) {    // ...}

新功能

UIAlertController 并不只是对已有的 API 做了清理,而是进行了标准化归纳。以前,预设的样式闲置有很多(swizzling 虽然可以提供更多的功能但还是有很大风险)。UIAlertController 让以前看起来很神奇的事情变为了可能。

带有警示按钮的 Alert

这种行为已经被 UIAlertActionStyle 所涵盖,共有三种类型:

.Default: 对按钮应用标准样式。

.Cancel: 对按钮应用取消样式,代表取消操作不做任何改变。

.Destructive: 对按钮应用警示性的样式,提示用户这样做可能会改变或删除某些数据。

所以想要对模态的 alert 加一个警示性的按钮,只需要加上 .Destructive 风格的 UIAlertAction 属性:

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

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 方法:

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)

创建注册表单

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}

注意

如果试图向 alert controller 添加带有 .ActionSheet 属性的输入框,将会抛出异常:

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 按钮将会抛出异常:

Terminating app due to uncaught exception NSInternalInconsistencyException, reason: 'UIAlertController can only have one action with a style of UIAlertActionStyleCancel'

转载地址:http://dqhnx.baihongyu.com/

你可能感兴趣的文章
VC6.0多线程例程
查看>>
Unity 3D-AR开发-Vuforia教程手册
查看>>
放球问题 组合数学 转自百度百科
查看>>
神经网络的火热
查看>>
视图之一--创建简单的视图
查看>>
for循环实例
查看>>
N1试卷常考词汇总结
查看>>
构建之法阅读笔记(1)
查看>>
POJ 3663:Costume Party
查看>>
主机连接虚拟机 web服务
查看>>
ajaxSubmit的data属性
查看>>
NetStatusEvent info对象的状态或错误情况的属性
查看>>
linux命令学习
查看>>
Windows下第三方库安装Nuget与Vcpkg
查看>>
URL的截取问题
查看>>
My first post
查看>>
git分支
查看>>
Ehcache 缓存
查看>>
list删除重复元素
查看>>
绘制屏幕时给单选按钮分组
查看>>