[Swift]UIAlertController 以及 Swift 中的闭包和枚举
原文地址:http://blog.callmewhy.com/2014/10/08/uialertcontroller-swift-closures-enum/
在 iOS8 的 SDK 中, UIKit 框架里两个经常使用的 API 有了比較大的修改。UIActionSheet 和 UIAlertView 都被 UIAlertController 替换了。
在 iOS8 里,假设你想要弹出消息,你应该使用 UIAlertController 而不是那两个不建议使用的类了。 ActionSheet 和 AlertView 都变成了 UIAlertController 的风格。在创建 UIAlertController 的时候你能够选择不同的风格,button事件的处理方法也又一次设计了,不再须要像曾经那样使用 delegate 处理用户操作。当使用 UIAlertController 的时候,你能够把事件和控制器关联起来,事件在 Objective-C 中是一个 block 而在 Swift 中则是一个闭包 (closure)。
在这篇教程里,我们将会介绍 UIAlertController 而且演示怎样使用它来弹出消息和表单。借此机会,我刚好简单的解说一些 Swift 中闭包和枚举的内容。

创建 Xcode 项目
通过项目来学习是最好的方法,我们新建一个 Single View Application 的项目并将其命名为 UIAlertDemo 。记得选中 Swift 作为默认的开发语言。
在 Xcode6 中, Size Class 是默认开启的状态,为了让代码尽量的简单易懂,在此教程中我们不会使用相关的新特性,选中 Main.storyboard 文件而且在属性中去掉 Use Size Classes 的勾选。取消勾选之后会提醒选择默认设备类型,选中 iPhone 而且点击 Disable Size Classes 就可以。这样我们的 ViewController 看起来就是 iPhone 的尺寸了。
拖拽一个button到视图中而且设置标题为 Hello Alert ,这样就完毕了前戏准备工作。

加入 Action 方法
在 ViewController.swift 里,为button加入一个方法,接下来我们会将它和 Storyboard 关联起来:
@IBAction func showAlert() {
}
Outlet 和 Action 让我们能够把源代码和 UI 对象关联起来,在 Swift 里,我们在方法名前加入 @IBAction 关键字,表明这是一个 Action 方法。这种方法将会和 Storyboard 关联起来。
接下来我们将会把button和方法关联起来。在左側的缩略图中,按住 Control 键并从button拖拽到 ViewController 上,松开button,选择 showAlert 方法:

使用 UIAlertViewController 弹框
我们已经完毕了主要的项目配置,如今能够開始学习 UIAlertController 类的使用了。大致来说,为了弹出提示信息,大致须要完毕下面几个步骤:
- 创建一个 UIAlertController ,设置它的标题、内容以及式样。
- 定义 UIAlertAction 对象,而且把它加到 AlertController 中。
- 通过调用
presentViewController方法弹出内容。
假设用 Swift 写,看起来大概是这个样子的:
@IBAction func showAlert() {
let alertController = UIAlertController(title: "Hey AppCoda", message: "What do you want to do?", preferredStyle: .Alert)
let defaultAction = UIAlertAction(title: "OK", style: .Default, handler: nil)
alertController.addAction(defaultAction)
presentViewController(alertController, animated: true, completion: nil)
}
非常easy,不是吗?我们仅仅须要设定 Style 值就能够选择弹出的是消息还是表单。假设是 .Alert 则是弹出消息,.ActionSheet 则相应表单。
默认情况下, AlertController 并没有和不论什么 Action 关联起来。假设你没有加入不论什么 Action 会导致无法关闭弹出的内容。在上面的代码中,我们创建了一个 UIAlertAction 的实例,而且通过 addAction 方法把它和 AlertController关联起来。在初始化 UIAlertAction 的时候,你须要指定标题 (Title),样式 (Style) 和处理器 (Handler) 。Handler 是一个代码块,会在button被点击的时候运行。我们仅仅须要把 Handler 设置成 nil 就能够关闭弹出的窗体。在后面的内容里会有具体的解说。
最后,我们调用 presentViewController 方法弹出页面,假设你运行一下演示样例程序,点击button你会得到一个弹出的消息 (取决于你设定的样式) :

简要的谈谈 Swift 中的枚举
假设你是第一次编写 Swift 的代码,你可能不太熟悉在设定样式时使用的 . 语法。你能够这样重写一下前面的代码:
let alertController = UIAlertController(title: "Hey AppCoda", message: "What do you want to do?", preferredStyle: UIAlertControllerStyle.Alert)
代码是全然一样的,我们仅仅是准确的指定了枚举类型, UIAlertControllerStyle 实际上是一个枚举类:
enum UIAlertControllerStyle : Int {
case ActionSheet
case Alert
}
Swift 中的枚举类型能够让你把相关的值放到一个组里,枚举中定义的值 (比如: AlertSheet 和 Alert) 就是成员的值。 Objective-C 里,成员在创建的时候会指定一个常量值,比方0和1,而 Swift 中则不是这样。以 UIAlertControllerStyle 为例, ActionSheet 和 Alert 并未定义为0和1,每一个成员在枚举中都是完整的值。
你能够通过枚举类型 (比方 UIAlertControllerStyle) 加上点和成员值的方式来指定枚举值。UIAlertControllerStyle.Alert 就是一个典型的样例。得益于 [Swift 的类型推导特性],我们在指定枚举值的时候能够去掉前面的枚举类型,这也就是为什么能够写作 .Alert 和 .ActionSheet 的原因。
let alertController = UIAlertController(title: "Hey AppCoda", message: "What do you want to do?", preferredStyle: .Alert)
这种缩略形式的点语法能够让你少写代码而且让你的代码更具有可读性。
Handler 和闭包
让我们回到 UIAlertController 里,我们还没有讨论 UIAlertAction 中的 handler 。当我们创建一个 UIAlertAction 的时候,我们能够把一个代码块指定为 handler 。当用户触发了 Action 事件的时候便会运行这段代码。我们能够在 showAlert 方法里插入例如以下代码加入一个新的 action :
let callActionHandler = { (action:UIAlertAction!) -> Void in
let alertMessage = UIAlertController(title: "Service Unavailable", message: "Sorry, the call feature is not available yet. Please retry later.", preferredStyle: .Alert)
alertMessage.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil))
self.presentViewController(alertMessage, animated: true, completion: nil)
}
let callAction = UIAlertAction(title: "Call", style: .Default, handler: callActionHandler)
alertController.addAction(callAction)
在这里我们加入了一个 callAction 用来弹出提示。在 Swift 里,这种代码块叫做闭包 (Closure) 。闭包是可传递的功能代码块,非常像 Objective-C 中的 block 。正如上面的样例那样,假设想要声明某个 action 的闭包,方法之中的一个是把这个代码块声明成一个常量或者变量。第一个部分定义了 handler 的參数为 UIAlertAction 类型,关键词 in 表明前面的參数和返回类型都已经定义完毕,后面便是闭包的内容:

事实上我们并没有必要声明一个单独的变量来存储闭包的内容,我们能够直接把闭包作为一个參数传过去。 Swfit 能够猜測參数的类型,所以我们能够这样简化代码:
let callAction = UIAlertAction(title: "Call", style: .Default, handler: {
action in
let alertMessage = UIAlertController(title: "Service Unavailable", message: "Sorry, the call feature is not available yet. Please retry later.", preferredStyle: .Alert)
alertMessage.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil))
self.presentViewController(alertMessage, animated: true, completion: nil)
}
)
alertController.addAction(callAction)
总结
通过这篇教程,我希望你能理解 UIAlertController 的基本用法。希望你喜欢这个 iOS8 里的新伙计!
你能够在这里下载源代码。
原文地址:
[Swift]UIAlertController 以及 Swift 中的闭包和枚举的更多相关文章
- Swift中的闭包(Closure) 浅析
转载自:http://www.devtalking.com/articles/closure-expressions-in-swift/ 闭包在Swift中非常有用.通俗的解释就是一个Int类型里存储 ...
- Swift 中的闭包与 C 和 Objective-C中的 blocks 以及其它一些编程语言中的 lambdas 比較类似。
闭包是功能性自包括模块,能够在代码中被传递和使用. Swift 中的闭包与 C 和 Objective-C中的 blocks 以及其它一些编程语言中的 lambdas 比較相似. 闭包能够 捕获 和 ...
- Swift中的闭包(Closure)[转]
闭包在Swift中非常有用.通俗的解释就是一个Int类型里存储着一个整数,一个String类型包含着一串字符,同样,闭包是一个包含着函数的类型.有了闭包,你就可以处理很多在一些古老的语言中不能处理的事 ...
- SwiftCafe 咖啡时光 - 了解 Swift 中的闭包
闭包(Closure) 是现代开发语言的必备特性,极大的提高了我们的开发效率. 关于闭包,你可以把它理解为一种特殊的变量或对象.简而言之,我们通常的对象,里面存储的是变量或对象的值,而闭包里面存储的是 ...
- swift中的闭包总结
闭包是功能性自包含模块,可以在代码中被传递和使用. Swift 中的闭包与 Objective-C中的 blocks 以及其他一些编程语言中的 lambdas 比较相似. 闭包的基本语法 闭包表达式语 ...
- Swift语法简介(二)闭包
突然看到别人写的关于Block的帖子,让我突然有一种想写一篇关于闭包的帖子.在我的认知中,Swift中的闭包,就是Object-C中的Block--(或许我的认知太浅了).先上一个闭包的简单例子 le ...
- 【Swift学习】Swift编程之旅---闭包(十一)
闭包是可以在代码中被传递和使用的自包含功能模块,它很像c和oc中的block,和.net中的lambdasbas表达式. 闭包可以捕获和存储其所在上下文中任意常量和变量的引用. 包裹着这些常量和变量的 ...
- Swift语法基础入门三(函数, 闭包)
Swift语法基础入门三(函数, 闭包) 函数: 函数是用来完成特定任务的独立的代码块.你给一个函数起一个合适的名字,用来标识函数做什么,并且当函数需要执行的时候,这个名字会被用于“调用”函数 格式: ...
- Swift学习之十四:闭包(Closures)
* 闭包(Closures) * 闭包是自包含的功能代码块,可以在代码中使用或者用来作为参数传值. * 在Swift中的闭包与C.OC中的blocks和其它编程语言(如Python)中的lambdas ...
随机推荐
- HDU 1800 Flying to the Mars Trie或者hash
http://acm.hdu.edu.cn/showproblem.php?pid=1800 题目大意: 又是废话连篇 给你一些由数字组成的字符串,判断去掉前导0后那个字符串出现频率最高. 一开始敲h ...
- 3D 应用程序性能
原文:3D 应用程序性能 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/m0_37591671/article/details/74595999 3 ...
- MySql Order By 多个字段 排序规则
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/xlxxcc/article/details/52250963 说在前面 突发奇想,想了解一下mysq ...
- 读取Webpage表中的内容 分类: H3_NUTCH 2015-02-10 14:59 418人阅读 评论(0) 收藏
nutch将从网页中抓取到的信息放入hbase数据库中,默认情况下表名为$crawlId_webpage,但表中的内容以16进制进行表示,直接scan或者通过Java API进行读取均只能读取到16进 ...
- 撸代码--类QQ聊天实现(基于linux 管道 信号 共享内存)
一:任务描写叙述 A,B两个进程通过管道通信,像曾经的互相聊天一样,然后A进程每次接收到的数据通过A1进程显示(一个新进程,用于显示A接收到的信息),A和A1间的数据传递採用共享内存,相应的有一个B1 ...
- C运行时库(C Run-time Library)详解(提供的另一个最重要的功能是为应用程序添加启动函数。Visual C++对控制台程序默认使用单线程的静态链接库,而MFC中的CFile类已暗藏了多线程)
一.什么是C运行时库 1)C运行时库就是 C run-time library,是 C 而非 C++ 语言世界的概念:取这个名字就是因为你的 C 程序运行时需要这些库中的函数. 2)C 语言是所谓的“ ...
- Nginx的一些介绍
Apacheserver:http://httpd.apache.org,世界上用的最多的server,开放源码.支持跨平台,可移植性,模块支持丰富,虽速度和性能及内存消耗不及其它轻量级Webserv ...
- Windows批处理(cmd/bat)常用命令
Windows批处理(cmd/bat)常用命令 一.总结 一句话总结: 1.批量处理图片的方式? PS批处理是基于强大的图片编辑软件Photoshop的,用来批量处理图片的脚本: 2.大量的重复的操作 ...
- spring mvc redirect 重定向 跳转并传递参数
在项目中做form表单功能提交时,防止用户客户端后退或者刷新时重复提交问题,需要在服务端进行重定向跳转,具体跳转方式有以下几种方式: 公用代码: @RequestMapping(value=" ...
- php如何实现读取网易有道词典输出单词的xml格式并且转化为html形式
php实现读取网易有道词典输出单词的xml格式并且转化为html形式 一.总结 一句话总结:将xml中的文件用preg_match_all读出来,然后组合成想要的数据 1.explode除了爆炸的意思 ...