你知道 UIAlertView
、UIActionSheet
(以及它们各自的 delegate protocols) 在 iOS 8 中已经被废弃了吗?
这是真的。在你的代码中按住 ⌘ 点击 UIAlertView
或者 UIActionSheet
,你就会看到最上面的注释:
UIAlertView
is deprecated. UseUIAlertController
with apreferredStyle
ofUIAlertControllerStyleAlert
instead.
你可能好奇为什么 Xcode 不直接警告你这个变化呢?别急,往下读:
1 |
@availability(iOS, introduced=2.0) |
虽然类已经被废弃了,但在 @availability
属性中并没有表达出这一点。UIAlertView
目前还是能用的。
最开始的时候,UIAlertView
充满了无底线的让步,牺牲格式和设计正确性来顺应开发者的喜好。它的delegate
类型是在初始化函数中注释的 (delegate:(id /* <UIAlertViewDelegate */)delegate
),并且在 protocol 方法中实现了让人匪夷所思的概念——buttonAtIndex:
的 “clicked” 而不是 “tapped”;然后还提供了不限数量的参数来引入 otherButtonTitles
,因此 button 的索引管理变得非常痛苦;一个 -show
方法也根本不考虑 view 的层级关系……类似的问题数不胜数。
UIActionSheet
也一样糟糕,但是开发者大多数时间里都没时间想起那些糟糕的使用方法,与其相关的抱怨特就更少了。
因此,介绍 UIAlertController
给大家,就好比派出军队解放一座被占领的城市一样。它不仅仅改进了那些让人头疼的 API,也开辟了一条为最新设备上 UIKit 特性适配的新路径。
本周文章的主题就是 UIAlertController
,向大家展示如何替换旧的 alert,以及这些操作方法的高级扩展。
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 这种方式,而是采用更简便的完成时回调。
新旧 Alert 方式对比
标准的 Alert 样式
旧方法:UIAlertView
1 2 3 |
let alertView = UIAlertView(title: "Default Style", message: "A standard alert.", delegate: self, cancelButtonTitle: "Cancel", otherButtonTitles: "OK") alertView.alertViewStyle = .Default alertView.show() |
1 2 3 4 5 6 7 |
// MARK: UIAlertViewDelegate func alertView(alertView: UIAlertView, clickedButtonAtIndex buttonIndex: Int) { switch buttonIndex { // ... } } |
新方法:UIAlertController
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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 = .Default actionSheet.showInView(self.view) |
1 2 3 4 5 6 7 |
// MARK: UIActionSheetDelegate func actionSheet(actionSheet: UIActionSheet, clickedButtonAtIndex buttonIndex: Int) { switch buttonIndex { ... } 注释:
你可能好奇为什么 Xcode 不直接警告你这个变化呢?别急,往下读:
虽然类已经被废弃了,但在 最开始的时候,
因此,介绍 本周文章的主题就是
新的方式并没有把所有的 alert 按钮配置都放在初始化函数中,而是引入了一个新类 新旧 Alert 方式对比标准的 Alert 样式旧方法:UIAlertView
新方法:UIAlertController
标准的 Action Sheet 样式UIActionSheet
|