SwiftiOS应用开发实战.html.pdf

上传人:紫竹语嫣 文档编号:5514141 上传时间:2020-05-27 格式:PDF 页数:227 大小:29.67MB
返回 下载 相关 举报
SwiftiOS应用开发实战.html.pdf_第1页
第1页 / 共227页
SwiftiOS应用开发实战.html.pdf_第2页
第2页 / 共227页
SwiftiOS应用开发实战.html.pdf_第3页
第3页 / 共227页
SwiftiOS应用开发实战.html.pdf_第4页
第4页 / 共227页
SwiftiOS应用开发实战.html.pdf_第5页
第5页 / 共227页
点击查看更多>>
资源描述

《SwiftiOS应用开发实战.html.pdf》由会员分享,可在线阅读,更多相关《SwiftiOS应用开发实战.html.pdf(227页珍藏版)》请在三一文库上搜索。

1、前言 为什么要写这本书 苹果公司在2014年6月的WWDC(Worldwide Developers Conference,苹果全球开发者大会)上向公众展现了全新的iOS 8移动操作系统和Yosemite桌面操作系统。作为开发者,大会开幕之前的任 何爆料,我都是不会错过的。在大会开幕的前一天,我得知本届大会的宣传标语为:编写代码改变世界(Write the Code.Change the World)。历届WWDC的宣传标语都是以全新、卓越、领先、创 新、引领等作为关键词,而这次却使用了非常接地气的“编写代码”一词,心里感觉怪怪的。在WWDC结束的那一刻,我深深地体会到苹果为什么使用这个词,因

2、为此时此刻,苹果做出了一个令所有程序 员都为之惊讶的改变推出了全新的程序设计语言Swift。Swift无疑是本届WWDC中贴近开发者的最大亮点。 为什么苹果要抛弃已经使用了几十年的Objective-C,而去开发一门全新的程序设计语言呢?按照苹果官方的说法,Objective-C这门语言太老了,它无法提供现代语言所具有的那些功能,而Swift语言 具有现代、安全、快速等特点。其实在我看来,这是苹果极其强烈的控制欲在作怪。 在写作本书之前,我已经写过两本关于iOS开发的书,毫无疑问它们都是在讲如何使用Objective-C开发App的。可以说Swift是我写作这本书的最大挑战,并且它给我的身心造

3、成了极大的摧残。因为在 WWDC开幕之前,我基本上已经完成了第三本关于Objective-C图书的初稿。可谁又知道,Swift的出现如同晴天霹雳、飞来横祸,让我有种被秒杀的感觉。就这样放弃吗?不行,此时此刻,我想到了八九 年前每晚玩魔兽世界的情景不断地“跑尸”。为了完成自己的iOS开发三部曲,必须发扬当年“跑尸”跑不死的精神。总的算下来我的第三本书前后共写了两年的时间。 作为苹果公司独立发布的支持型开发语言,Swift语言的语法内容混合了Objective-C、JavaScript、Python的特点,语法简单、使用方便、易学,大大降低了开发者的入门门槛。同时Swift语言还可以 与Objec

4、tive-C混合使用,对于用惯了高难度Objective-C语言的程序员来说,学会Swift更不在话下! Swift允许开发者通过更简洁的代码来实现更多的内容。在WWDC 2014发布会上,苹果演示了如何只通过一行简单的代码完成一个完整图片列表加载的过程。另外,Swift还可以让开发人员一边编写 程序,一边预览自己的应用程序,从而快速测试应用在某些特殊情况下的反应。 相信对使用Objective-C语言开发过App的程序员来说,Objective-C有着诡异的语法,并且是一门与其他C语言风格迥异的编程语言,学习难度可想而知。但是,在过去的20年里,苹果只支持 Objective-C,这迫使广大

5、程序员不得不学习和使用艰涩难懂的Objective-C语言。 随着Swift语言的到来,这种简单、好用又安全的编程语言将吸引更多的开发者加入,让苹果软件生态圈更加繁荣。如此,“果粉”将可以在App Store和Mac Store中下载到更多称心如意的App。从 某种意义上说,Swift语言是苹果的一项新的商业战略。 对Swift语言来说,相信大部分的读者都是从2014年6月开始接触的,而之后的几个月也应该在刻苦地学习Swift这门语言。就像实际生活中我们学习英语一样,精通英语的语法和使用英语进行相互沟通 并不完全是一回事。学习程序语言也是如此,虽然程序员可以在短时间内掌握Swift的语法,但是

6、使用它来开发App是另一个层面上的事情了。本书每一章都通过各种各样相对独立的项目,让读者了解iOS 开发中最常用的几个方面的程序设计技能,包括Interface Builder、自动布局和Size Class、表格视图、导航控制器和标签控制器、远程访问及Facebook集成等。本书能让那些已经掌握Swift语言的程序员 尽快上手开发实现各种功能的App,体验开发的乐趣。 读者对象 本书是为想通过学习基本的工具和技术,开发出具有实用功能的、可以在iOS平台上面完美运行的App的人所准备的。 本书读者主要为: iOS设备的用户和爱好者。 iOS应用程序业余开发者,使用Objective-C开发过简

7、单App。 iOS应用程序专业开发者,使用Objective-C开发过商业App。 已经掌握苹果最新的Swift语言,正准备进行项目开发的程序员。 开设相关课程的大专院校学生。 如何阅读本书 在阅读本书之前,需要具备以下几方面的知识和硬件条件。 面向对象的开发经验,熟悉类、实例、方法、封装、继承、重写等概念。 有Swift或Objective-C、C、C+的开发经验。 有MVC设计模式开发经验。 有简单的图像处理经验。 一台Intel架构的Mac电脑(Macbook Pro、Macbook Air、Mac Pro或Mac Mini)。 如果加入了iOS开发者计划,还可以准备一台iOS移动设备。

8、 本书通过大量的实例项目来讲解如何使用Swift开发简单的应用程序,虽然每个App所实现的功能都不复杂,但是都能帮读者了解每章重点讲授的知识点和技巧,只有“打通”每个点以后,一个完美的 App才能流畅运行。如果你是一名初学者,请一定从第1章开始学习。 本书内容共12章,下面概述各章内容。 第1章介绍了Swift语言的特性、Playground编辑器和iOS模拟器,重点介绍了开发iOS应用程序的集成开发环境Xcode。 第2章和第3章通过一个简单计算器应用程序向大家介绍Xcode的用户界面搭建工具Interface Builder、Outlet与Action关联、MVC设计模式、应用程序委托和视

9、图控制器。 第4章通过购物应用程序向大家介绍如何使用故事板组织和管理视图。 第5章介绍表格视图的相关知识,包括与表格相关的委托协议,并且继续完善购物应用程序。 第6章介绍自动布局的相关知识,当程序员使用Interface Builder搭建App的用户界面时,往往要考虑不同分辨率和屏幕尺寸的设备,有时候一个场景需要做出10套左右的界面。但是通过自动布局可以 让我们只需搭建好一套用户界面,就可以在所有的设备上完美运行。 第7章介绍集合视图的相关知识,通过在购物应用程序中使用集合视图来显示各种商品的缩略图。 第8章通过制作IMDb电影信息查询程序,向大家介绍如何使用Swift语言进行远程服务器调用

10、,并将获取的XML数据进行整理并显示到屏幕上。 第9章使用Photos.framework框架实现在应用程序中获取照片库或摄像头所拍摄的照片。 第10章介绍如何在应用程序中整合Facebook和Twitter社交分享功能。 第11章介绍如何进行应用程序的调试。 第12章介绍如何在应用程序中进行文件和文件目录的管理。 勘误和支持 由于作者的水平有限,加之编写时间仓促,书中难免会出现一些错误或者不准确的地方,恳请读者批评指正。为此,特意留下联系的电子邮件liuming_。你可以就书中的错误和我进行沟 通,当然,遇到任何技术问题也可以与我联系,我将尽力为你提供最满意的解答,期待能够得到你的真挚反馈。

11、另外,书中的资源文件可以从华章网站()下载。 致谢 首先要感谢的是一直在背后默默支持我的老婆刘颖。因为没有她就没有现在的我,非常感谢她在我写书的时候没有像平时那样唠唠叨叨,为我创造了一个轻松的环境。 感谢我身边的每一位充满创意和活力的朋友张燕、卢红玲、秦琼、杨晓龙、陈雪峰、朱舸、赵顺利、吴永新,以及名单之外的更多朋友,感谢你们长期以来对我的支持和帮助。 感谢机械工业出版社华章公司的编辑杨福川老师,在这三年多的时间中你始终支持我的写作,你的鼓励和帮助引导我能顺利完成全部书稿。 最后感谢我的爸爸、妈妈、岳父、岳母、小舅子和小舅子的女朋友,感谢你们时时刻刻为我灌输信心和力量! 谨以此书献给我最亲爱的

12、儿子乐乐,以及众多热爱苹果公司的朋友们! 刘铭 第1章 Swift简介 北京时间2014年6月3日凌晨1点,苹果公司(以下简称苹果)在美国旧金山Moscone中心举行了WWDC开发者大会开幕式,会上正式发布了iOS 8移动操作系统以及OS X Yosemite桌面操作系统。抛 开Yosemite不谈,苹果在iOS 8中更新了很多内容,其中包括: 锁屏状态下直接快速删除通知。 支持发送语音信息。 输入法支持预判联想功能。 新增Healthkit健康应用。 Siri支持流媒体识别,可以直接通过它购买音乐。 自带相册集成更强大的图片处理软件。 大幅改善中国的地图体验。 Spotlight支持搜索音乐

13、、电影、餐厅、App Store中的应用。 可以接入第三方键盘,将是否授权输入法的选择留给用户。 邮件支持更多的手势操作。 如果说iOS 8中新增加的这些特性可以让广大用户激动不已,那么此次大会推出的全新程序设计语言Swift(中文翻译为雨燕,爱称为小燕子)就可以让所有的iOS程序员发飙。为什么是发飙而不是 疯狂呢?道理很简单,大部分的程序员可能会在之后的一段时间内放弃使用了多年的已经驾轻就熟的Objective-C语言,辛苦地学习一门新的程序设计语言。 另外,按照苹果的一贯风格,只要推出了一款新的产品来替代旧的产品,那么对应的旧产品就离退市不远了。有过iOS开发经历的“程序猿”都知道,当初苹

14、果使用自动引用计数器(Automatic Reference Counting,ARC)特性来代替手工管理内存,以及使用自动布局(Auto Layout)来代替Resizing Layout,最终的结果都是这种情况。 那么Swift好学吗?已经掌握了Objective-C的“程序猿”是否可以平稳地过渡到Swift?笔者现在还不能给出明确的答案,相信在看完这本书以后,你就能得到答案。 1.1 初识Swift Swift是苹果在WWDC 2014所发布的一门编程语言,用于开发iOS和OS X应用程序。 2010年7月LLVM编译器的原作者暨苹果开发工具部门总监克里斯拉特纳(Chris Lattne

15、r,就是在WWDC 2014大会上亲自演示Swift代码的那位仁兄)开始着手开发Swift语言,一直到2014年6月发 布,Swift大约经历了4年的开发期。在WWDC 2014大会中,苹果宣称Swift的特点是:快速、现代、安全和具有交互性。 Swift的处理速度非常快。在WWDC上,苹果展示了Swift、Objective-C以及Python的速度对比,Swift比Objective-C快1.4倍,比Python快3.9倍,如图1-1所示。在进行RC4加密算法测试中,Swift 则是Python的220倍。但笔者认为苹果在这里使用了障眼法,因为每门编程语言都有其优缺点,如果非要用自己的长处

16、与别人的短处相比,明显有些小气了。 在笔者看来,Swift就像是一门可以被编译的脚本语言。因为在很多语法特性上Swift和一些脚本确实非常相似。但是,在应用程序开发中,Swift不是以一门脚本语言来运行的,所有的Swift代码都会被 LLVM编译为本地代码,然后以极高的效率运行。 图1-1 Swift与Objective-C和Python的速度对比 Swift和Objective-C都是类型安全的语言,变量和方法都有明确的返回,并且变量在使用前需要进行初始化。而在语法方面,Swift迁移到了业界公认的非常先进的语法体系,其中包含了闭包、多返 回、泛型和大量的函数式编程的理念,函数终于可以作为变

17、量保存了1。初步看来,Swift在语法上借鉴了Ruby的很多人性化设计,但借助苹果自己手中强大的LLVM编译器,在性能上必然要甩开Ruby很 远。 从另一方面说,Swift的代码又是可以通过交互来“解释”执行的。Xcode 6加入了所谓的Playground功能来对开发者输入的Swift代码进行交互式响应,当然,我们也可以使用Swift的命令行工具交互 式地执行Swift语句。这里之所以把“解释”两个字打上双引号,是因为即使在命令行中,Swift其实不是被解释执行的,而是在每条指令后都从开始的Swift代码全部进行编译,然后执行。这样的做法依然 可以让人“感到”是在做交互解释执行,由此这门语言

18、的编译速度和优化水平可见一斑。同时Playground还顺便记录了每条语句在执行时的各种情况,称做一组Timeline。我们可以使用Timeline对代码执 行逐步检查,省去断点调试的时间,也很方便,如图1-2所示。 图1-2 Swift的Playground功能 不知大家是否有这样的想法:既然苹果的生态系统做得这样出色,为什么还要推出一门全新的语言,这不是自找麻烦吗?在WWDC 2014大会上,克雷格费德里吉2(Craig Federighi)给出了这样的 答案:苹果一直使用Xcode作为Mac和iOS平台的开发工具,而Xcode的核心是我们用来开发应用的Objective-C语言,它已经为

19、我们服务了20多年,我们很喜欢它。但我们必须问自己一个问题,一个没有 C的Objective-C会是什么样子? 苹果不仅仅想了,还将其付诸实践,因此出现了Swift语言,并且苹果希望使用Swift来主导该领域。苹果将Swift视为“亲生儿子”,并把它视为Objective-C的继承者。作为iOS或Mac的开发者,笔者 深感学习和使用Swift的必要性。现在Swift可以和原来的Objective-C或C代码混用(不同于Objective-C和C+或C在同一个.mm文件中的混编,Swift文件不能和Objective-C代码写在同一个文件中,需要 将两种代码分开)。编译出来的二进制文件是可以运行

20、在iOS 7和iOS 8设备上(不支持iOS 6及之前的系统)。 现在Xcode 6中所有的文档都有Objective-C和Swift两种语言版本,并且按照苹果开发者社区的一贯跟进速度,有理由相信在不久的将来,苹果很可能会逐步废弃对Objective-C的支持,而全面支持 Swift。所以,关于到底是学Swift还是Objective-C的问题,笔者的建议是,尽快学习Swift,尽快使用Swift。在苹果无数工程师和语言设计天才的努力下,Swift吸收了众多语言的精华,应该是当下最新也 是最先进的一门编程语言之一。我想,也正是苹果对这门语言有这样的自信,才会在公司全盛的时候,不墨守成规,如此大

21、胆地推出新的语言。因为苹果必定比你我都更明白,更换语言带来的利必须远大 于弊,才会值得冒如此大的风险。从这个意义上来说,WWDC 2014大会就是程序开发业界的一枚重磅炸弹,也必将写入史册,而你我身在其中,变成了这段历史的见证者。修改一位伟人的话:苹果开发 是Swift的,也是Objective-C的,但归根结底是Swift的。 1 Swift语言上的特性不在本书的介绍范围之内,你可以下载苹果官方的The Swift Programming Language一书,或者在CocoaChina上面下载其中文版本。 2 在苹果的iOS操作系统从拟物化转变为扁平化的过程中,克雷格费德里吉起到了很大的作

22、用。 1.2 了解Playground 本书使用Xcode 6 beta 4作为开发工具,与之前发布的beta 1版本相比,beta 4对Swift语言做了大幅度改进。开发者可以使用Swift来编写更好、更安全的应用程序,而且新版本的Swift也修正了许多 开发者提出的请求,尤其是对数组进行了重新设计。但是,beta版本毕竟不同于正式版,依然存在着许多Bug,只不过对Swift初学者来说影响不大。 启动Xcode 6,就会看到一个欢迎界面,如图1-3所示。欢迎界面分为左右两部分,左侧有三个选项,分别是直接启动playground、创建一个新的Xcode项目和从仓库导出一个项目。右侧则是一个最

23、近编辑的项目列表,如果项目没有出现在列表中,可以点击底部的“Open another project”链接进行选择。接下来,我们在欢迎界面中点击“Get started with a playground”链接,启动 Playground。 图1-3 Xcode 6的欢迎界面 1.2.1 Playground的编辑器模式 Playground是什么呢?它是Xcode 6中新引入的一种文档类型,在该文档类型的文件中封装了一些有用的东西,其中包括全部的Swift代码。Swift代码会在Playground环境中实时运行,并且只要我们 在Playground中编辑Swift代码,就会马上自动显示结果

24、。Swift文档也能包含一个文件夹,里面可以内嵌那些供代码使用的资源。另外,我们还可以在Playground文件中引用那些外部的、存储在系统中的 可利用资源。最后,Playground还可以包含一个时间轴(Timeline),时间轴可以在边栏中通过可视化方式显示结果,这个特性对开发者来说非常实用。下面分步讲解如何创建一个文件。 步骤1 在Xcode的欢迎界面中点击“Get started with a playground”,在弹出的文件选项面板中设置Name为“HelloWorld”,设置Platform为“iOS”,如图1-4所示。 图1-4 设置新建文件的选项 步骤2 确定好文件的保存位

25、置以后,会自动打开Playground编辑器,其中左侧是Swift代码,而在右侧的边栏中会显示运行的结果。将之前的Swift代码修改成下面这样: / Playground - noun: a place where people can play import UIKit var string = “hello“ + “ “ + “world“ for i in 0http:/ Device、iPhone 4s、iPhone 5、iPad 2、iPad Retina、iPad Air等可选项,如 图1-27所示。 图1-27 Scheme字段的弹出菜单 说明 从Xcode 6开始,我们就不能在

26、iOS模拟器中模拟iPhone 4s之前的设备以及第一代iPad设备了,因为这些设备无法支持iOS 7以上的系统。 1.5.1 iOS模拟器的特性 我们可以使用iOS模拟器模拟不同的设备,其中包括iPhone和iPad系列产品。在系统版本方面,Xcode 6只支持iOS 7和iOS 8。模拟器在运行的时候,可以通过菜单中的“HardwareDevice”来改变 iOS的版本,如图1-28所示。 提示 如果需要安装其他不同版本的iOS SDK,需要在Xcode菜单中选择“PreferencesDownloadsComponents”,之后选择相应的版本下载即可。 图1-28 在iOS模拟器中选择

27、模拟不同的iOS版本 通过“HardwareDevice”菜单操作,我们可以在模拟器中切换不同的设备。根据iOS版本的不同,所模拟的设备也有所不同。iOS 8.0比7.1增加了Resizable iPhone和Resizable iPad两个选项,据 说这两个选项与iOS 8可能加入的多窗口操作有关。 通过iOS模拟器菜单中的“Rotate Left”(Command+快捷键)或“Rotate Right”(Command+快捷键)来调整模拟器的方向,如图1-29所示。 图1-29 旋转iOS模拟器的方向 iOS模拟器允许我们模拟一个或两个手指的多点触摸操作。一个手指的操作,比如点击、长按、划

28、动等都可以通过鼠标很好地模拟。实现两个手指的操作需要按住键盘上的Option键,然后按住鼠标拖 曳来模拟缩放操作。如果要移动两个手指在屏幕的中心位置,则需要同时按住Shift和Option两个键。想要在模拟器中实现iOS设备的摇动效果,可以通过“HardwareShake Gesture”(Control+Command+Z快捷键)来完成。 如果我们开发的应用程序需要地图数据,可以在应用程序运行的时候,使用iOS模拟器模拟一个位置。选择“DebugLocationCustom Location”,然后输入经纬度数值即可,如图1-30所示。 图1-30 在iOS模拟器中手动输入经纬度坐标 iOS

29、模拟器还可以模拟一个移动的位置,当设计的应用程序需要获取实时改变的地理位置时,这个功能就显得非常有用。iOS模拟器可以模拟的位置包括如下这些: Apple:苹果总部。 City Bicycle Ride:在城市中骑自行车。 City Run:在城市中跑步。 Freeway Drive:无确定方向的驾驶汽车。 如果我们开发的应用程序允许用户打印一些东西,在没有兼容AirPrint打印机的情况下,可以使用打印机模拟器模拟打印。打印机模拟器不会在程序启动时自动运行,需要选择“FileOpen Printer Simulator”。 1.5.2 模拟器中iOS系统的基本设置 在安装好Xcode后,模拟

30、器中运行的iOS默认语言是英文,默认区域格式是美国,而且输入法也仅有英文一种。作为中国的程序员,我们希望将模拟器设置成和国内iPhone手机用户一样的使用环境, 所以需要进行下面几步操作: 1)在Xcode菜单中选择“XcodeOpen Developer TooliOS Simulator”。 2)在模拟器的主屏上点击“SettingsGeneralLanguage func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) - UITableViewCell var cell =

31、UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: “Cell“) cell.textLabel?.text = “牛奶“ return cell -tableView:numberOfRowsInSection:方法负责返回表格视图中每部分(section)的单元格(row)行数。对Shopping项目来说,我们只要一个section,所以直接返回单元格行数即可,这里设 置返回值为4。 -tableView:cellForRowAtIndexPath:方法则会返回表格视图所需要显示的每一个单元格(UITa

32、bleViewCell类型)对象。因为之前设置了-tableView:numberOfRowsInSection:方法的返回值 为4,所以一共会执行4次-tableView:cellForRowAtIndexPath:方法。 每次执行-tableView:cellForRowAtIndexPath:方法时,都会通过-init-With-Style:reuse-Identifier:方法创建一个单元格对象,然后设置该单元格的textLabel(UILabel对象)属性的text值为字 符串“牛奶”。 -initWithStyle:reuseIdentifier:是UITableViewCell类

33、的初始化方法,用于创建单元格对象。该方法有两个参数,style用于设置单元格的风格,它是UITableViewCellStyle类型的枚举变量,该枚举 类型包括:Default、Value1、Value2和Subtitle4种风格。 reuseIdentifier参数是一个字符串类型的变量,用于从可复用单元格池中获取指定标识的单元格对象,这句话是什么意思呢?原来由于iOS设备受到内存大小的限制,要想在表格视图中显示成千上万行 的数据,我们可能需要创建成千上万个UITableView Cell类型的单元格对象(若每个单元格需要1MB的内存空间,300个单元格就会需要大约300MB,而iPhone

34、 5s的RAM只有1GB)。物理内存是否可以 提供给程序这么多的内存空间呢?答案是否定的。幸运的是,苹果通过一种优化的方式来解决这个问题,那就是UITableViewCell的复用池技术。因为在任何时候,iPhone手机最多只会显示一整屏数量的 单元格,我们随时可以复用那些已经创建,但被用户滑出屏幕的单元格对象。 如图4-7所示,一开始在屏幕的表格视图上只显示了A1到A7这7个单元格,此时可复用池中还没有能用的单元格对象,所以这7个单元格都需要创建。当用户向上滑动表格视图时,A1单元格被移出表格 视图的可视范围,此时系统并不会销毁A1单元格,而是将其放入可复用池中备用。在A1被移出的同时,A8

35、单元格被移入表格视图之中,所以在创建A8单元格的1时候,就可以通过-initWithStyle: reuseIdentifier:方法(或者-dequeueReusableCellWithIdentifier:forIndexPath:)到可复用池中查找是否有可用的单元格对象,有就直接复用,否则会创建一个全新的单元格。如此一来,即便有再 多的数据需要显示给用户,其所用到的单元格对象也只是极少的几个或十几个,最多不超过几十个,占用的内存空间并不大。 图4-7 使用可复用池示意 另外,单元格复用池并不关心池子里面放的是什么类型和布局的单元格对象,那么我们怎么能从池子中复用所需要类型的单元格对象呢?

36、幸运的是,每个单元格都有一个reuse Identifier属性,它是 String类型的对象。当表格视图需要一个可复用单元格对象时,它会通过reuse Identifier属性从可复用池中获取指定类型的单元格对象。通常,我们为reuse Identifier属性指定一个简短的名字。在 Shopping项目中,单元格的reuse Identifier值是Cell。 构建并运行应用程序,效果如图4-8所示。 图4-8 Shopping应用程序的运行效果 1 上面介绍的这两种方法将会在之后的章节用到。本章会先调用UITableViewCell类的初始化方法initWithStyle:reuseId

37、entifier:来创建单元格对象。 4.1.3 创建数据模型 在上一节中,我们强行指定4个单元格都显示牛奶。接下来,我们会通过数组为表格视图提供需要显示的数据,其实这些数组就是简单的数据模型。 步骤1 在ViewController类中声明一个常量toBuyItems,用于存储需要购买的商品信息。 classViewController: UIViewController, UITableViewDelegate, UITableViewDataSource IBOutlet weak var tableView: UITableView! let toBuyItems = (“牛奶“,“三

38、元“),(“红烧牛肉面“,“康师傅“), (“桃汁“,“汇源“),(“巧克力“,“德芙“), (“地板净“,“滴露“),(“洗发水“,“飘柔“) override func viewDidLoad() toBuyItems数组常量一共包含6个元组,每个元组都由商品名称和品牌组成。 步骤2 修改-tableView:numberOfRowsInSection:和-tableView:cellForRowAtIndex Path方法如下面这样: func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -

39、Int return toBuyItems.count; func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) - UITableViewCell var cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: “Cell“) let (item, brand) = toBuyItemsindexPath.row cell.textLabel?.text = item cell.de

40、tailTextLabel?.text = brand return cell 在该方法中,我们根据indexPath的row属性获取需要创建的单元格信息,然后取得toBuyItems数组所对应的元组数据,再将商品名赋值给单元格的textLabel属性,将品牌名赋值给单元格的 detailTextLabel属性,最后返回所创建的单元格对象。 如果此时构建并运行应用程序,在模拟器中我们只能看到商品信息,并不能看到其品牌信息,这是因为之前所设置的单元格风格是UITableViewCellStyle.Default,修改单元格风格为 UITableViewCellStyle.Value1,再次构建并

41、运行应用程序,效果如图4-9所示。如果你愿意,还可以将风格设置为UITableViewCellStyle.Value2或UITableViewCellStyle.Subtitle。 4.1.4 添加导航控制器 当创建好购物清单后,我们将会为应用程序创建一个导航控制器(Navigation Controller)。导航控制器是组织多个视图控制器的一个主力军,它是基于栈的,也就是说最新入栈的视图控制器是可见 的。 图4-9 单元格风格设置为Value1、Value2和Subtitle的运行效果 如果你还不熟悉栈这种数据结构,这里通过一个简单的例子来说明一下:栈很像是一副摞好的扑克牌,我们永远只能看

42、到最上的那一张,如果再放一张,也只能看到最新的那张。如果从栈中移除一 张,则会看到它下面的那张。一般情况下,我们会使用压入和弹出描述入栈和出栈的操作。 因为当用户点击表格视图中的某个商品时,希望可以看到该商品的详细信息。添加导航控制器的方法有很多,其中最简单的就是通过嵌入的方式。 步骤1 确保故事板中View Controller的视图处于选中状态,菜单中选择“Editor Embed InNavigation Controller”。 图4-10 在故事板中通过嵌入方式为现存的视图添加导航控制器 现在,我们所创建的视图已经被嵌入导航控制器中,而且还继承了一个来自导航控制器的导航栏。此时导航栏

43、上还没有标题,以致用户在看到该界面的时候不清楚它的用途,接下来我们修复这个问 题。 步骤2 鼠标左键双击View Controller视图中导航栏的中间位置,然后输入“购物清单”。另外,也可以在IB中选中导航栏,然后将实用工具区域切换到属性检视窗(Command+Option+4快捷 键),在Navigation Item部分中将Title属性设置为“购物清单”,如图4-11所示。 图4-11设置导航栏的标题信息 接下来,我们还要在购物清单视图的导航栏中添加一个按钮,当用户点击该按钮以后,可以创建欲购买的商品。 步骤3 切换到对象库,在对象库中找到Bar Button Item,并将其拖曳到导

44、航栏中的右侧。在选中该按钮的状态下打开属性检视窗,将Bar Button Item部分中的Identifier设置为“Add”,如图4-12 所示。 图4-12 在导航栏中添加bar button item用于创建新的购物商品 接下来,我们将在项目中创建两个新的视图控制器,一个用于添加欲购置的商品,另一个用于显示商品的详细信息。 4.1.5 创建其他的视图控制器 在本节中,我们将添加两个视图控制器类用于创建欲购商品和显示商品信息。 步骤1 项目导航中,在Shopping文件夹上点击鼠标右键,选择“New File”。在出现的文件类型模板中选择“iOSSourceSwift File”,设置文件

45、名为“NewItemViewController”,然后点 击“Create”按钮。 步骤2 打开NewItemViewController.swift文件,删除里面的所有代码,然后创建New-ItemViewController类,代码如下面这样: import UIKit class NewItemViewController: UIViewController override func viewDidLoad() super.viewDidLoad() override func didReceiveMemoryWarning() super.didReceiveMemoryWarni

46、ng() 通过观察我们能够发现,NewItemViewController类中的大部分代码与ViewController类相同,直接复制即可。 此时,我们只是在代码方面创建了一个控制器类,在故事板中还要创建一个与之有关系的视图。 步骤3 打开Main.storyboard,从对象库中拖曳一个View Controller到IB中。该视图控制器还要与我们之前创建的NewItemViewController类“发生关系”,所以在故事板中选中新创建的View Controller场景,切换到标识检视窗(Command+Option+3快捷键),在Custom Class部分中将Class设置为New

47、ItemViewController,如图4-13所示。 图4-13 将NewItemViewController类与故事板中新添加的视图建立联系 当操作完成以后,NewItemViewController类的view属性(指针变量)会指向故事板中刚创建的视图对象。接下来,我们要在该视图中添加两个标签(label)和两个文本框(text field)以及一个按 钮(button)。 步骤4 从对象库中拖曳一个Label到New Item View Controller的视图中,将其停靠在状态栏的下方,宽度打开到足够大,均以参考线为准。双击Label并修改其内容为“商品名称:”。再拖曳一个 Te

48、xt Field放置在Label的下方,宽度与之前的一致。复制上面的Label和Text Field对象到下面的位置,然后修改第二个Label的内容为“商品品牌:”,最终效果如图4-14所示。 图4-14 添加两个Label和两个Text Field对象到视图 提示 在IB中,我们有时需要调整故事板的显示比例。当比例不是11时,我们不能对视图进行编辑,这包括向视图添加控件、改变控件大小及位置等,只有在100%的显示比例下才能进行编辑。 步骤4 从对象库中拖曳一个Button对象到第二个Text Field的下方,调整其宽度与之前的Text Field相同。在属性检视窗中,设置按钮的Title为

49、“保存该商品”,如图4-15所示。 图4-15 在Text Field的下面增加一个按钮保存增加的商品 步骤5 开启助手编辑器模式,为上面的Text Field与NewItemViewController类创建Outlet关联,Name设置为itemNameTextField,其余均为默认值。再为下面的Text Field创建Outlet关 联,Name设置为brandNameTextField。 步骤6 为下面的按钮创建Action关联,Name设置为saveItem,Type设置为UIButton,Event设置为Touch Up Inside,代表当用户的手指按下后,在按钮抬起时会触发Action方法。 关闭助手编辑器模式,重新打开Main.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/环境 > 建筑资料


经营许可证编号:宁ICP备18001539号-1