iOS 8开发指南

978-7-115-36845-4
作者: 管蕾
译者:
编辑: 张涛

图书目录:

详情

本书内容完全基于当前iOS的最新版本iOS 8,详细讲解了iOS8的最新功能和API。另外,本书中使用Objective-C和Swift两种语言进行编写,从当前广大程序员追捧Swift的热度来看,本书必将引领广大读者的追捧。

图书摘要

iOS 8开发指南
管蕾 编著
人民邮电出版社

北京

前言

2014年6月3日,苹果公司在WWDC2014开发者大会上正式发布了全新的iOS 8操作系统。iOS 8系统采用了一套全新的配色方案,整个界面呈现半透明果冻色,拨号、天气、日历、短信等几乎所有应用的交互界面都进行了重新设计,整体看来更为动感、时尚。为了帮助读者迅速掌握iOS 8应用开发的核心技术,笔者特意编写了本书。

本书特色

本书内容丰富,实例全面。我们的目标是通过一本图书,提供多本图书的价值。在内容的编写上,本书具有以下特色。

(1)Objective-C和Swift实现。

本书中的实例不仅使用Objective-C语言实现,而且使用了苹果公司推出的Swift语言。通过本书的学习,读者可以掌握使用Objective-C语言和Swift语言开发iOS程序的方法。

(2)结构合理。

从读者的实际需要出发,科学安排知识结构,内容由浅入深,叙述清楚。全书详细地讲解了和iOS开发有关的知识点。

(3)易学易用。

读者可以按照本书编排的章节顺序进行学习,也可以根据自己的需求对某一章节进行有针对性的学习。书中提供的丰富实例可以帮助读者学以致用。

(4)实用性强。

本书彻底摒弃枯燥的理论和简单的操作,注重实用性和可操作性,通过实例的实现过程,详细讲解了各个知识点的具体应用。

(5)内容全面。

无论是搭建开发环境,还是控件接口,或是网络、多媒体和动画以及游戏应用开发,在本书中你都能找到解决问题的答案。

本书的内容安排

第一篇 必备技术篇

第1章 iOS开发入门

第2章 Objective-C语言基础

第3章 Swift语言基础

第4章 Cocoa Touch框架

第5章 Xcode Interface Builder界面开发

第6章 使用Xcode编写MVC程序

第二篇 核心技术篇

第7章 文本框和文本视图

第8章 按钮和标签

第9章 滑块、步进和图像

第10章 开关控件和分段控件

第11章 Web视图控件、可滚动视图控件和翻页控件

第12章 提醒和操作表

第13章 工具栏、日期选择器

第14章 表视图(UITable)

第15章 活动指示器、进度条和检索条

第16章 UIView详解

第17章 视图控制器

第三篇 技术进阶篇

第18章 实现多场景和弹出框

第19章 iPad弹出框和分割视图控制器

第20章 界面旋转、大小和全屏处理

第21章 图形、图像、图层和动画

第22章 声音服务

第23章 多媒体应用

第24章 定位处理

第25章 和互联网接轨

第26章 读写应用程序数据

第四篇 技术提高篇

第27章 触摸和手势识别

第28章 和硬件之间的操作

第29章 地址簿、邮件和Twitter

第30章 开发通用的项目程序

第31章 推服务和多线程

第32章 Touch ID详解

第33章 游戏开发

第五篇 综合实战篇

第34章 公交路线查询系统

读者对象

初学iOS编程的自学者;

大中专院校的老师和学生;

毕业设计的学生;

iOS编程爱好者;

相关培训机构的老师和学员;

从事iOS开发的程序员。

答疑和完整程序下载地址:www.toppr.net。

本书在编写过程中,得到了人民邮电出版社工作人员的大力支持,正是基于各位编辑的求实、耐心和效率,才使得本书在这么短的时间内出版。另外,也十分感谢我的家人,在我写作的时候给予的大力支持。由于作者水平有限,纰漏和不尽如人意之处在所难免,诚请读者提出意见或建议,以便修订并使之更臻完善,编辑联系邮箱为zhangtao@ptpress.com.cn。

编者

第一篇 必备技术篇

本篇内容

第1章 iOS开发入门

第2章 Objective-C语言基础

第3章 Swift语言基础

第4章 Cocoa Touch框架

第5章 Xcode Interface Builder界面开发

第6章 使用Xcode编写MVC程序

 

第1章 iOS开发入门

iOS是一个强大的系统,被广泛地应用于苹果公司的系列产品iPhone、iPad和iTouch设备中。iOS通过这些移动设备展示了一个多点触摸界面、可始终在线、视频以及众多内置传感器的界面。本章将带领大家认识iOS这款神奇的系统,为读者步入本书后面知识的学习打下基础。

 

1.1 iOS系统介绍

iOS是由苹果公司开发的手持设备操作系统。苹果公司最早于2007年1月9日的Mac World大会上公布这个系统,最初是设计给iPhone使用的,后来陆续套用到iPod touch、iPad以及Apple TV等苹果产品上。iOS与苹果的Mac OS X操作系统一样,本来这个系统名为iPhone OS,直到2010年6月7日WWDC大会上才宣布改名为iOS。2014年5月,根据互联网数据中心(IDC)公布的世界移动电话系统的市场占有率数据显示:2014年第一季度,苹果iOS的市场占有率增长稳定。

 

1.1.1 iOS发展史

iOS最早于2007年1月9日的苹果Macworld展览会上公布,随后于同年的6月发布第一版iOS操作系统,当初的名称为“iPhone运行OS X”。

2007年10月17日,苹果公司发布了第一个本地化iPhone应用程序开发包(SDK)。

2008年3月6日,苹果发布了第一个测试版开发包,并且将“iPhone runs OS X”改名为“iPhone OS”。

2008年9月,苹果公司将iPod touch的系统也换成了“iPhone OS”。

2010年2月27日,苹果公司发布iPad,iPad同样搭载了“iPhone OS”。

2010年6月,苹果公司将“iPhone OS”改名为“iOS”,同时还获得了思科iOS的名称授权。

2010年第四季度,苹果公司的iOS占据了全球智能手机操作系统26%的市场份额。

2011年10月4日,苹果公司宣布iOS平台的应用程序已经突破50万个。

2012年2月,应用总量达到552 247个,其中游戏应用最多,达到95 324个,比重为17.26%;书籍类以60 604个排在第二,比重为10.97%;娱乐应用排在第三,总量为56 998个,比重为10.32%。

2012年6月,苹果公司在WWDC 2012上推出了全新的iOS 6,提供了超过200 项新功能。

2013年6月10日,苹果公司在WWDC 2013上发布了iOS 7,几乎重绘了所有的系统APP,去掉了所有的仿实物化,整体设计风格转为扁平化设计。

2013年9月10日,苹果公司在2013秋季新品发布会上正式提供iOS 7下载更新。

2014年6月3日,苹果公司在WWDC2014开发者大会上正式发布了全新的iOS 8操作系统。

 

1.1.2 全新的版本——iOS 8

北京时间2014年6月3日凌晨,苹果年度全球开发者大会 WWDC 2014 在美国加利福尼亚州旧金山莫斯考尼西中心(Moscone Center)拉开帷幕。本次大会上苹果正式公布了最新版iOS系统版本iOS 8。全新的iOS 8继续延续了iOS 7的风格,只是在原有风格的基础上做了一些局部和细节上的优化、改进和完善,更加令人愉悦。iOS 8系统最突出的新特性如下所示。

(1)短信界面可以发送语音。

iOS 8很特别的一个新功能,短信界面除了可以发送文字和图片之外,还可以直接录制语音或者视频并直接发送给对方,这一功能和国内的交友软件——微信十分类似。

(2)输入法新功能:支持联想/可记忆学习。

iOS 8内建的输入法增加了和SwiftKey类似的功能,这是一款在安卓手机中非常流行的输入方式。iOS 8的全新输入功能名为QuickType,最突出的特点就是为用户提供“预测性建议”,它会对用户的习惯进行学习,进而在其录入文字的时候为其提供建议,从而大幅提升文字输入速度。

(3)更加实用的通知系统。

在iOS 8系统下,用户可以直接在通知中进行回复,包括短信、微博等在内的所有消息,即便是在锁屏界面也可以进行操作。另外,当双击Home按键开启任务栏界面后,会在上方显示一行最常用的联系人,用户可以直接在上面给其中某一个人发短信、打电话。

(4)正式挺进方兴未艾的健康和健身市场。

在iOS 8系统中内置了Healthbook应用,这是一款在iOS 8系统中运行的应用程序,苹果将利用它挺进方兴未艾的健康和健身市场,这一直是可穿戴设备公司追逐多年的重要领域。苹果公司的Healthbook应用程序将对用户的身体信息进行跟踪统计,其中包括步数、体重、卡路里燃烧量、心率、血压,甚至人体的水分充足状况。

(5)其他新特性。

消息推送新方式:用户可直接下拉通知栏回复消息。

多任务管理界面:在其上方新增最近联系人,并可直接进行发邮件、打电话等操作。

邮件:用户可直接在邮件界面快速调出日历,快速创建日程事项,此外,还可以在侧边栏通过手势快速处理邮件。

全局搜索更强大:用户可以在设备中实现搜索电影、新闻、音乐等。

iMessage功能更强大:加入群聊功能,可以添加/删除联系人,并且新增了语音发送功能。

iPad新增接听来电功能:用iPad也可以接听电话。

新增iCloud Drive云盘服务:实现在所有的Mac电脑和iOS设备,甚至Windows电脑之间共享文件。

企业服务方面:进一步增强易用性和安全性。

Family Sharing(家庭共享):家庭成员间可共享日程、位置、图片和提醒事项等。另外,还可以通过该功能追踪家庭成员的具体位置。

照片新功能:新的Photo加入了更多的编辑功能,以及更智能的分类建议,此外还加入iCloud(5GB免费空间),实现多设备之间共享。

Siri进一步更新:可直接用“hey siri”唤醒。

支持中国农历显示,增强输入法和天气数据。

(6)针对开发者的新特性。

支持第三方键盘。

自带网页翻译功能,如在线即时翻译功能。

指纹识别功能开放,使用第三方软件可以调用。

Safari浏览器可直接添加新的插件。

可以把一个网页上的所有图片打包分享到Pinterest。

支持第三方输入法:将是否授权输入法的选择留给用户。

Home Kit智能家居:可以利用iPhone对家居,如灯光等进行控制。

3D图像应用Metal:可以更充分利用CPU和GPU的性能。

引入全新基于C语言的编程语言Swift。

全新的Xcode。

相机和照片API也实现开放。

 

1.2 iPhone和iPad

强大的iOS系统被广泛地应用于苹果的移动系列产品中,开发人员无需纠结于开发的程序是否能在不同的硬件设备中运行,其实只要是iOS程序,就可以在支持iOS系统的设备中运行。不同设备之间的差异,只是表现在屏幕大小的区别而已。在当前的iOS开发项目中,主要是开发两类程序:iPhone程序和iPad程序,这两者的屏幕大小不一样。

 

1.2.1 令人称奇的iPhone

iPhone是一个集合了照相、个人数码助理、媒体播放器以及无线通信设备的掌上智能手机。iPhone最早由乔布斯在2007年1月9日举行的Macworld上宣布推出,2007年6月29日在美国上市。2007年6月29日,iPhone 2G在美国上市,2008年7月11日,苹果公司推出3GiPhone。2010年6月8日凌晨1点,乔布斯发布了iPhone 4。2011年10月5日凌晨,iPhone 4S发布。2012年9月13日凌晨(美国时间9月12日上午)iPhone 5发布。2013年9月10日,苹果公司在美国加州的新闻发布会上,推出两款新iPhone型号:iPhone 5C及iPhone 5S,全新的iPhone 5S如图1-1所示。

图1-1 全新的iPhone 5S

根据专家预测,屏幕更大的iPhone 6将于2014年9月发布。

 

1.2.2 改变世界的iPad

iPad是一款苹果公司于2010年发布的平板电脑,定位介于苹果的智能手机iPhone和笔记本电脑产品之间,通体只有4个按键,与iPhone布局一样。提供浏览互联网、收发电子邮件、看电子书、播放音频或视频等功能。

2010年1月27日,在美国旧金山芳草地艺术中心举行的苹果公司发布会上,平板电脑iPad正式发布。

2012年3月8日,苹果公司在美国芳草地艺术中心发布第三代iPad。第三代iPad的外形与iPad 2相似,但电池容量增大,有3块4000mAh锂电池,芯片速度更快,使用A5X双核处理器,图形处理器功能增强,配四核GPU。

2012年10月24日,苹果公司举行新品发布会发布第四代ipad平板电脑。

2013年10月22日,苹果公司发布配备Retina(视网膜)屏幕的iPad mini(iPad mini with Retina Display)。原有的iPad mini不再提供32GB以上容量的机型,但容量16GB机型仍继续提供。

2013年10月23日,苹果公司发布iPad Air,屏幕尺寸为9.7英寸,更轻、更薄,最低售价499美元,于2013年11月1日开售。iPad Air继续采用视网膜显示屏,边框更窄;厚度为7.5毫米,比上一代薄了20%;重量是1磅(约合454克),上一代重量则是1.4磅,轻了近30%。在内部元器件方面,iPad Air平板电脑采用苹果A7处理器,并搭配了M7协处理器,CPU处理性能是上代产品的8倍,图形处理能力更是提高了72倍。后置摄像头像素是500万,支持1080p高清视频FaceTime;电池续航能力达到10小时,iPad Air如图1-2所示。

图1-2 iPad Air

 

1.3 iOS开发之旅

要想成为一名iOS开发人员,首先需要拥有一台Intel Macintosh台式机或笔记本电脑,并运行苹果的操作系统,如Snow Leopard或Lion。硬盘至少有6GB的可用空间,开发系统的屏幕空间越大,就越容易营造高效的工作空间。Lion用户甚至可将Xcode切换到全屏模式,将分散注意力的元素都隐藏起来。对于广大读者来说,还是建议购买一台Mac机器,因为这样的开发效率更高,也避免一些因为不兼容所带来的调试错误。除此之外,还需要加入Apple开发人员计划。

其实无需任何花费即可加入到Apple开发人员计划(Developer Program),然后下载iOS SDK(软件开发包)、编写iOS应用程序,并且在Apple iOS模拟器中运行它们。但是毕竟收费与免费之间还是存在一定的区别:免费会受到较多的限制。例如,要想获得iOS和SDK的beta版,必须是付费成员。要将编写的应用程序加载到iPhone中或通过App Store发布它们,也需支付会员费。本书的大多数应用程序都可在免费工具提供的模拟器中正常运行,因此,接下来如何做由你决定。

注意:如果不确定成为付费成员是否合适,建议读者先不要急于成为付费会员,而是先成为免费成员,在编写一些示例应用程序并在模拟器中运行它们后再升级为付费会员。显然,模拟器不能精确地模拟移动传感器输入和GPS数据等。

如果读者准备选择付费模式,付费的开发人员计划提供了两种等级:标准计划(99美元)和企业计划(299美元),前者适用于要通过App Store发布其应用程序的开发人员,而后者适用于开发的应用程序要在内部(而不是通过App Store)发布的大型公司(雇员超过500)。你很可能想选择标准计划。

注意:其实无论是公司用户还是个人用户,都可选择标准计划(99美元)。在将应用程序发布到AppStore时,如果需要指出公司名,则在注册期间会给出标准的“个人”或“公司”计划选项。

无论是大型企业还是小型公司,无论是要成为免费成员还是付费成员,我们的iOS开发之旅都将从Apple网站开始。首先,访问Apple iOS开发中心(http://www.apple.com.cn/developer/ios/index.html),如图1-3所示。

图1-3 Apple iOS的开发中心页面

如果通过使用iTunes、iCloud或其他Apple服务获得了Apple ID,可将该ID用作开发账户。如果目前还没有Apple ID,或者需要新注册一个专门用于开发的新ID,可通过注册的方法创建一个新Apple ID,注册界面如图1-4所示。

单击图1-4中的“Create Apple ID”按钮后可以创建一个新的 Apple ID账号,注册成功后输入登录信息登录,登录成功后的界面如图1-5所示。

图1-4 注册Apple ID的界面
图1-5 使用Apple ID账号登录后的界面

在成功登录Apple ID后,可以决定是加入付费的开发人员计划还是继续使用免费资源。要加入付费的开发人员计划,请再次将浏览器指向iOS开发计划网页(http://developer.apple.com/programs/ios/),并单击“Enron New”链接加入。阅读说明性文字后,单击“Continue”按钮开始进入加入流程。

在系统提示时选择“I’m Registered as a Developer with Apple and Would Like to Enroll in a Paid Apple Developer Program”,再单击“Continue”按钮。注册工具会引导我们申请加入付费的开发人员计划,包括在个人和公司选项之间做出选择。

 

1.4 工欲善其事,必先利其器——搭建开发环境

学习iOS开发也离不开好的开发工具的帮助,如果使用的是Lion或更高版本,下载iOS开发工具将很容易,只需通过简单地单击操作即可。为此,在Dock中打开Apple Store,搜索Xcode并免费下载它,坐下来等待Mac下载大型安装程序(约3GB )。如果你使用的不是Lion ,可以从iOS开发中心(http://developer.apple.com/ios)下载最新版本的iOS开发工具。

注意:如果是免费成员,登录iOS开发中心后,很可能只能看到一个安装程序,它可安装Xcode和iOS SDK (最新版本的开发工具);如果你是付费成员,可看到指向其他SDK版本(5.1、6.0等)的链接。本书的示例必须在5.0+系列iOS SDK环境中运行。

 

1.4.1 Xcode 6介绍

要开发iOS的应用程序,需要一台安装有Xcode工具的Mac OS X计算机。Xcode是苹果提供的开发工具集,提供了项目管理、代码编辑、创建执行程序、代码调试、代码库管理和性能调节等功能。这个工具集的核心就是Xcode程序,提供了基本的源代码开发环境。

Xcode是一款强大的专业开发工具,可以简单快速,并以我们熟悉的方式执行绝大多数常见的软件开发任务。相对于创建单一类型的应用程序所需要的能力而言,Xcode要强大得多,它设计目的是使我们可以创建任何想得到的软件产品类型,从Cocoa及Carbon应用程序,到内核扩展及Spotlight导入器等各种开发任务,Xcode都能完成。Xcode独具特色的用户界面可以帮助我们以各种不同的方式来漫游工具中的代码,并且可以访问工具箱下面的大量功能,包括GCC、javac、jikes和GDB,这些功能都是制作软件产品需要的。它是一个由专业人员设计、又由专业人员使用的工具。

由于能力出众,Xcode已经被Mac开发者社区广为采纳。而且随着苹果电脑向基于Intel的Macintosh迁移,转向Xcode变得比以往任何时候都更加重要。这是因为使用Xcode可以创建通用的二进制代码,这里所说的通用二进制代码是一种可以把PowerPC和Intel架构下的本地代码同时放到一个程序包执行的文件格式。事实上,对于还没有采用Xcode的开发人员,转向Xcode是将应用程序连编为通用二进制代码的第一个必要的步骤。

Xcode的官方地址是:https://developer.apple.com/xcode/downloads/,如图1-6所示。

截止到2014年6月,市面中最主流版本是Xcode 5,最新版本是Xcode 6 beta,其最突出的特点如下所示。

(1)Xcode 6增加了一个全新的iOS模拟器,允许开发者根据设备调整应用尺寸,除了“Resizable iPhone”和“Resizable iPad”之外,还包括iPhone 5/5S、iPad 2/Retina/Air等具体设备,如图1-7所示。

图1-6 Xcode的官方地址
图1-7 全新的iOS模拟器

(2)完全支持Swift编程。

Xcode 6为开发者引入了一种全新的设计和开发应用的方式,深度支持Swift编程,开发者不仅能使用100%的Swift代码来创建一款崭新的应用,还可以向已存在的应用添加Swift代码或框架,并在Swift或Objective-C中查看文档。例如“Jump to Definition”、“Open Quickly”等在Swift中均能很好地工作,甚至Objective-C的头定义在Swift语法中也能良好地呈现。

(3)实时的代码效果预览。

现在,开发者在使用Interface Builder设计界面时,能够实时地预览代码效果。当程序运行时,自定义对象将在设计时展现。当开发者修改自定义视图代码时,Interface Builder的设计画布则会自动更新,而无需任何的构建和运行操作。

此外,其所包含的API还支持向IB Inspector添加参数来快速修改视图,甚至开发者还可以预先填充示例数据视图来让界面更加准确。而支持UIKit大小类的iOS脚本则能够让开发者为所有iOS设备开发单一的通用脚本,不仅能为特定的设备尺寸或方向进行行为选择,还可以保持接口的一致性,且易于维护。

(4)新增View Debugging功能。

Xcode 6实现了此前备受开发者期待的View Debuger。现在,调试应用UI就像按单击按钮那样简单,开发者可以轻而易举地看到为什么一个视图可能会被裁剪或隐藏,并在Inspector中检查和调试约束及其他参数。当然,Xcode还包含了其他新的调试工具,比如调试Gauge来监控I/O用法、增强版的iCloud Gauge等,而Debug Navigator也将显示更有用的信息,包括栈框架记录和块队列等。

 

1.4.2 iOS SDK介绍

iOS SDK是苹果公司提供的iPhone开发工具包,包括了界面开发工具、集成开发工具、框架工具、编译器、分析工具、开发样本和一个模拟器。在iOS SDK中包含了Xcode IDE和iPhone模拟器等一系列其他工具。苹果官方发布的iOS SDK则将这部分底层API进行了包装,用户的程序只能和苹果提供的iOSSDK中定义的类进行对话,而这些类再和底层的API进行对话。

最明显的例子就是OpenGL ES,苹果官方发布的iOS SDK中的OpenGL ES实际是和底层API中CoreSurface这个框架进行对话,来实现渲染功能。

1.iOS SDK的优点和缺点

苹果官方iOS SDK的缺点如下所示。

CoreSurface(硬件显示设备)、Celestial(硬件音频设备)以及其他几乎所有和硬件相关的处理无法实现。

无法开发后台运行的程序。

需要代码签名才能够在真机上调试。

只能在Leopard 10.5.2以上版本、Inter Mac机器上进行开发。

苹果官方iOS SDK的优点如下所示。

开发环境几乎和开发Mac软件一样,一样的XCode、Interface Builder、Instruments工具。

最新版本的iOS SDK可以使用Interface Builder制作界面。

环境搭建非常容易。

用代码签名可以避免恶意软件。

使用官方iOS SDK开发的软件需要经过苹果的认可才可发布到苹果的App Store上。用户可以通过App Store直接下载或通过iTunes下载软件并安装到iPhone中。

2.iOS程序框架

总的来说iOS程序有两类框架,一类是游戏框架,另一类是非游戏框架,接下来将要介绍的是非游戏框架,即基于iPhone用户界面标准控件的程序框架。

典型的iOS程序包含一个Window (窗口)和几个UIViewController (视图控制器),每个UIViewController可以管理多个UIView (在iPhone里你看到的、感觉到的都是UIView ,也可能是UITableView、UIWebView、UIImageView等)。这些UIView之间如何进行层次迭放、显示、隐藏、旋转、移动等都由UIViewController进行管理,而UIViewController之间的切换,通常情况是通过UINavigationController、UITabBarController或UISplitViewController进行切换。

(1)UINavigationController。

是用于构建分层应用程序的主要工具,它维护了一个视图控制器栈,任何类型的视图控制器都可以放入。它在管理以及换入和换出多个内容视图方面,与UITabBarController(标签控制器)类似。两者间的主要不同在于UINavigationController是作为栈来实现,它更适合用于处理分层数据。另外,UINavigationController还有一个作用是用作顶部菜单。

当你的程序具有层次化的工作流时,就比较适合使用UINavigationController来管理UIViewController,即用户可以从上一层界面进入下一层界面,在下一层界面处理完以后又可以简单地返回到上一层界面,UINavigationController使用堆栈的方式来管理UIViewController。

(2)UITabBarController。

当我们的应用程序需要分为几个相对比较独立的部分时,就比较适合使用UITabBarController来组织用户界面。如图1-8所示,屏幕下面被划分成了两个部分。

(3)UISplitViewController。

UISplitViewController属于iPad特有的界面控件,适合用于主从界面的情况(Master view→Detail view),Detail view跟随Master view进行更新。如图1-9所示,屏幕左边(Master View)是主菜单,单击每个菜单则屏幕右边(Detail View)就进行刷新,屏幕右边的界面内容又可以通过UINavigationController进行组织,以便用户进入Detail View进行更多操作,用户界面以这样的方式进行组织,使得程序内容清晰,非常有条理,是组织用户界面导航很好的方式。

图1-8 UITabBarController的作用
图1-9 UISplitViewController的作用

 

1.4.3 下载并安装Xcode 6

其实对于初学者来说,我们只需安装Xcode即可。通过使用Xcode,既能开发iPhone程序,也能够开发iPad程序。并且Xcode还是完全免费的,通过它提供的模拟器就可以在计算机上测试iOS程序。如果要发布iOS程序或在真实机器上测试iOS程序,就需要花99美元了。

1.下载Xcode

(1)下载的前提是先注册成为一名开发人员,打开苹果开发主页面https://developer.apple.com/,如图1-10所示。

(2)登录到Xcode的下载页面https://developer.apple.com/xcode/downloads/,找到“Xcode 6 beta”选项,如图1-11所示。

(3)如果是付费账户,可以直接在苹果官方网站中下载获得。如果不是付费会员用户,可以从网络中搜索热心网友们的共享信息,以此达到下载Xcode 6的目的。

注意:我们可以使用App Store来获取Xcode,这种方式的优点是完全自动,操作方便。

图1-10 苹果开发页面主页

2.安装Xcode

(1)下载完成后单击打开下载的“.dmg”格式文件,然后双击Xcode文件开始安装,如图1-12所示。

图1-11 Xcode的下载页面
图1-12 打开下载的Xcode文件

(2)双击Xcode下载到的文件开始安装,在弹出的对话框中单击“Continue”按钮,如图1-13所示。

(3)在弹出的欢迎界面中单击“Agree”按钮,如图1-14所示。

图1-13 单击“Continue”按钮
图1-14 单击“Continue”按钮

(4)在弹出的对话框中单击“Install”按钮,如图1-15所示。

(5)在弹出的对话框中输入用户名和密码,然后单击 “好”按钮,如图1-16所示。

图1-15 单击“Continue”按钮
图1-16 单击“Agree”按钮

(6)在弹出的新对话框中显示安装进度,进度完成后的界面如图1-17所示。

图1-17 完成安装

(7)Xcode 6的默认启动界面如图1-18所示。

注意:

(1)考虑到许多初学者没有购买苹果机的预算,可以在Windows系统上采用虚拟机的方式安装OS X系统。

(2)无论读者是已经有一定Xcode经验的开发者,还是刚开始迁移的新用户,都需要对Xcode的用户界面及如何用Xcode组织软件工具有一些理解,这样才能真正高效地使用这个工具。这种理解可以加深您对隐藏在Xcode背后的开发思想的认识,并帮助您更好地使用Xcode。

(3)建议读者将Xcode安装在OS X的Mac机器上,也就是装有苹果系统的苹果机上。通常来说,在苹果机器的OS X系统中已经内置了Xcode,默认目录是“/Developer/Applications”。

图1-18 启动Xcode 6后的初始界面

 

1.5 使用Xcode开发环境

经过本章第1.4节中的内容讲解之后,在接下来开始讲解使用Xcode开发环境的基本知识,为读者步入后面Objective-C知识的学习打下坚实的基础。

 

1.5.1 使用Xcode创建程序的基本步骤

使用Xcode创建程序的基本步骤如下。

(1)启动Xcode应用程序。

(2)如果开发新项目,依次选择File→New Project命令。

(3)为应用程序类型选择Command Line Utility、Foundation Tool,然后单击Choose按钮。

(4)选择项目名称,还可以选择在哪个目录中存储项目文件,然后单击Save按钮。

(5)在右上窗格中,会看到文件progl.m(或者是你为项目起的其他名称,后面是.m)。突出显示该文件。在该窗口下面出现的编辑窗口中输入你的程序。

(6)依次选择File→Save,保存已完成的更改。

(7)选择Build、Build and Run或单击Build and Go按钮构建并运行程序。

(8)如果出现任何编译器错误或输出内容不符合要求,对程序进行所需的更改并重复执行步骤6和步骤7。

 

1.5.2 Xcode的基本功能

1.改变公司名称

通过Xcode编写代码,代码的头部会有类似于图1-19所示的内容。

在此需要将这部分内容改为公司的名称或者项目的名称,注意在Xcode 3.2.x之前,需要命令行设置变量。之后就可以通过Xcode的配置项进行操作了,操作步骤分别如图1-20和图1-21所示。

图1-19 头部内容
图1-20 选择“Edit Project Settings”选项

这样如果再创建文件,就会产生如图1-22所示的效果。

图1-21 设置显示的内容
图1-22 新创建文件时自动生成的内容

2.通过搜索框缩小文件范围

当项目开发到一段时间后,源代码文件会越来越多。再从Groups & Files的界面去选择效率比较差。可以借助Xcode的浏览器窗口,如图1-23所示。

在图1-23的搜索框中可以输入关键字,这样浏览器窗口里只显示带关键字的文件了,比如只想看Book相关的类,如图1-24所示。

图1-23 Xcode的浏览器窗口
图1-24 输入关键字

3.格式化代码

例如,在图1-25所示的界面中,有很多行都顶格了,此时需要进行格式化处理。

选中需要格式化的代码,然后在上下文菜单中进行查找,这是比较规矩的办法,如图1-26所示。

图1-25 多行都顶格
图1-26 在上下文菜单中进行查找

Xcode没有提供快捷键,当然自己可以设置。我又比较喜欢用快捷键。我的做法是:Ctrl+A(全选文字)、Ctrl+X(剪切文字)、Ctrl+V(粘贴文字)。Xcode会对粘贴的文字格式化。

4.缩进代码

有的时候代码需要缩进,有的时候又要做相反的操作。单行缩进和其他编辑器类似,只需使用Tab键即可。如果选中多行则需要使用快捷键了,其中Command+]表示缩进,Command+[表示反向缩进。

5.代码的自动完成

使用IDE工具的一大好处是,工具能够帮助我们自动完成比较冗长的类型名称。Xcode提供了这方面的功能。比如下面的的输出日志:

NSLog(@"book author: %@",book.author);

如果都自己敲会很麻烦的,可以先敲ns,然后使用快捷键“Ctrl+.”,会自动出现如下代码:

NSLog(NSString * format)

然后填写参数即可。快捷键“Ctrl+.”的功能是自动给出第一个匹配ns关键字的函数或类型,而NSLog是第一个。如果继续使用“Ctrl+.”,则会出现比如NSString的形式。依此类推,会显示所有ns开头的类型或函数,并循环往复。或者,也可以用“Ctrl+,”快捷键,比如还是ns,那么会显示全部ns开头的类型、函数、常量等的列表。可以在这里选择。其实,Xcode也可以在你敲代码的过程中自动给出建议。比如咱们要敲NSString。当敲到NSStr的时候:

NSString

此时后面的ing会自动出现,如果和我预想的一样,只需直接按tab键确认即可。也许你想输入的是NSStream,那么可以继续敲。另外也可敲ESC键,这时就会出现结果列表供选择了,如图1-27所示。

如果是正在输入方法,那么会自动完成如图1-28所示的样子。

图1-27 出现结果列表
图1-28 自动完成的结果

我们可以使用Tab键确认方法中的内容,或者通过快捷键“Ctrl+/”在方法中的参数来回切换。

6.文件内查找和替代

在编辑代码的过程中经常会做查找和替代的操作,如果只是查找则直接按“Command+F”组合键即可,在代码的右上角会出现如图1-29所示的对话框。只需在里面输入关键字,不论大小写,代码中所有命中的文字都高亮显示。

也可以实现更复杂的查找,比如是否大小写敏感,是否使用正则表达式等。设置界面如图1-30所示。

图1-29 查找界面
图1-30 复杂查找设置

通过图1-31所示的“Find & Replace”可以切换到替代界面。

图1-31 “Find & Replace”替换

例如图1-32所示的界面将查找设置为大小写敏感,然后替代为myBook。

图1-32 替代为myBook

另外,也可以单击按钮进行全部替代,或查找一个替代一个等。如果需要在整个项目内查找和替代,则依次单击“Edit”→“Find”→“Find in Project…”命令,如图1-33所示。

还是以找关键字book为例,则实现界面如图1-34所示。

图1-33 “Find in Project…”命令
图1-34 在整个项目内查找“book”关键字

替代操作的过程也与之类似,在此不再进行详细讲解。

7.快速定位到代码行

如果想定位光标到选中文件的行上,可以使用快捷键“Command+L”来实现;也可以依次单击“Edit”→“Go to Line”命令实现,如图1-35所示。

在使用菜单或者快捷键时都会出现下面的对话框,输入行号和回车后就会来到该文件的指定行,如图1-36所示。

图1-35 “Go to Line”命令
图1-36 输入行号

8.快速打开文件

有时候需要快速打开头文件,例如图1-37所示的界面。要想知道这里的文件Cocoa.h到底是什么内容,可以鼠标光标选中文件Cocoa.h来实现。

依次单击“File”→“Open Quickly…”命令,如图1-38所示。

图1-37 一个头文件
图1-38 “Open Quickly…”命令

此时会弹出如图1-39所示的对话框。

此时双击文件Cocoa.h的条目就可以看到如图1-40所示的界面。

图1-39 “Open Quickly…”对话框
图1-40 文件Cocoa.h的内容

9.使用书签

使用Eclipse的用户会经常用到TODO标签,比如正在编写代码的时候需要做其他事情,或者提醒自己以后再实现的功能时,可以写一个TODO注释,这样可以在Eclipse的视图中找到,方便以后找到这个代码并修改。其实Xcode也有类似的功能,比如存在一段如图1-41所示的代码。

这段代码的方法printInfomation是空的,暂时不需要具体实现。但是需要记下来,便于以后能找到并补充。那么让光标定位在方法内部,然后单击鼠标右键,选择“Add to Bookmarks”命令,如图1-42所示。

图1-41 一段代码
图1-42 选择“Add to Bookmarks”命令

此时会弹出一个对话框,可以在里面填写标签的内容,如图1-43所示。

这样就可以在项目的书签节点找到这个条目了,如图1-44所示。此时单击该条目,可以回到刚才添加书签时光标的位置。

图1-43 填写标签的内容
图1-44 在项目的书签节点找到这个条目

10.自定义导航条

在代码窗口上边有一个工具条,此工具条提供了很多方便的导航功能,例如图1-45所示的功能。

也可以用来实现上面TODO的需求。这里有两种自定义导航条的写法,其中下面是标准写法。

#pragma mark

而下面是Xcode兼容的格式。

// TODO: xxx

// FIXME: xxx

完整的代码如图1-46所示。

图1-45 一个导航条
图1-46 完整的代码

此时会产生如图1-47所示的导航条效果。

11.使用Xcode帮助

如果想快速查看官方API文档,可以在源代码中按下“Option”键并用鼠标双击该类型(函数、变量等),如图1-48所示的是NSString的API文档对话框。

图1-47 产生的导航条效果
图1-48 NSString的API文档对话框

如果单击图1-48中标识的按钮,会弹出完整文档的窗口,如图1-49所示。

图1-49 完整文档的窗口

12.调试代码

最简单的调试方法是通过NSLog打印出程序运行中的结果,然后根据这些结果判断程序运行的流程和结果值是否符合预期。对于简单的项目,通常使用这种方式就足够了。但是,如果开发的是商业项目,需要借助Xcode提供的专门调试工具。所有的编程工具的调试思路都是一样的。首先要在代码中设置断点,此时可以想象一下,程序的执行是顺序的,可能怀疑某个地方的代码出了问题(引发bug),那么就在这段代码开始的地方,比如方法的第一行,或者循环的开始部分,设置一个断点。那么程序在调试时会在运行到断点时终止,接下来可以一行一行地执行代码,判断执行顺序是否是自己预期的,或者变量的值是否和自己想的一样。

设置断点的方法非常简单,比如想对红框表示的行设置断点,就单击该行左侧红圈位置,如图1-50所示。

图1-50 单击该行左侧红圈位置

单击后会出现断点标志,如图1-51所示。

然后运行代码,比如使用“Command+Enter”命令,这时将运行代码,并且停止在断点处。如图1-52所示。

图1-51 出现断点标志
图1-52 停止在断点处

可以通过“Shift+Command+Y”命令调出调试对话框,如图1-53所示。

图1-53 调试对话框

这和其他语言IDE工具的界面大同小异,因为都具有类似的功能。下面是主要命令的具体说明:

Continue:继续执行程序。

step over, step into, step out:用于单步调试,具体说明如下。

●step over:将执行当前方法内的下一个语句。

●step into:如果当前语句是方法调用,将单步执行当前语句调用方法内部第一行。

●step out:将跳出当前语句所在方法,到方法外的第一行。

通过调试工具,可以对应用做全面和细致的调试。

 

1.6 启动iOS 8模拟器

Xcode是一款功能全面的应用程序,通过此工具可以轻松输入、编译、调试并执行Objective-C程序。如果想在Mac上快速开发iOS应用程序,则必须学会使用这个强大的工具的方法。在接下来将简单介绍使用Xcode编辑启动模拟器的基本方法。

(1)Xcode位于“Developer”文件夹内中的“Applications”子文件夹中,快捷图标如图1-54所示。

(2)启动Xcode 6后的初始界面如图1-55所示,在此可以设置创建新工程还是打开一个已存在的工程。

(3)单击“Create a new Xcode project”后会出现如图1-56所示的窗口。

图1-54 Xcode图标
图1-55 启动一个新项目

(4)在New Project窗口的左侧,显示了可供选择的模板类别,因为我们的重点是类别iOS Application,所以在此需要确保选择了它。而在右侧显示了当前类别中的模板以及当前选定模板的描述。就这里而言,请单击模板“Empty Application(空应用程序)”,再单击Next(下一步)按钮,窗口界面效果如图1-57所示。

图1-56 启动一个新项目:选择应用程序类型
图1-57 单击模板“Empty Application(空应用程序)”

(5)选择模板并单击“Next”按钮后,在新界面中Xcode将要求您指定产品名称和公司标识符。产品名称就是应用程序的名称,而公司标识符创建应用程序的组织或个人的域名,但按相反的顺序排列。这两者组成了束标识符,它将您的应用程序与其他iOS应用程序区分开来,如图1-58所示。

例如,我们将创建一个名为“exSwift”的应用程序,设置域名是“apple”。如果没有域名,在开发时可以使用默认的标识符。

(6)单击“Next”按钮,Xcode将要求我们指定项目的存储位置。切换到硬盘中合适的文件夹,确保没有选择复选框Source Control,再单击“Create(创建)”按钮。Xcode将创建一个名称与项目名相同的文件夹,并将所有相关联的模板文件都放到该文件夹中,如图1-59所示。

(7)在Xcode中创建或打开项目后,将出现一个类似于iTunes的窗口,您将使用它来完成所有的工作,从编写代码到设计应用程序界面。如果这是您第一次接触Xcode,令人眼花缭乱的按钮、下拉列表和图标将让您感到不适。为让您对这些东西有大致认识,下面首先介绍该界面的主要功能区域,如图1-60所示。

图1-58 Xcode文件列表窗口
图1-59 选择保存位置
图1-60 Xcode界面

(8)运行iOS模拟器的方法十分简单,只需单击左上角的按钮即可,运行效果如图1-61所示。

图1-61 iPhone模拟器的运行效果

 

1.7 iOS的常用开发框架

为了提高开发iOS程序的效率,除了可以使用Xcode集成开发工具之外,还可以使用第三方提供的框架,这些框架为我们提供了完整的项目解决方案,是由许多类、方法、函数、文档按照一定的逻辑组织起来的集合,以便使研发程序变得更容易。在OSX下的Mac操作系统中,大约存在80个框架,这些框架可以用来开发应用程序,处理Mac的Address Book结构、刻制CD、播放DVD、使用QuickTime播放电影、播放歌曲等。

在iOS的众多框架中,其中有两个最为常用的框架:Foundation框架和Cocoa框架。

 

1.7.1 Foundation框架简介

在OSX下的Mac操作系统中,为所有程序开发奠定基础的框架称为Foundation框架。该框架允许使用一些基本对象,例如数字和字符串,以及一些对象集合,如数组、字典和集合。其他功能包括处理日期和时间、自动化的内存管理、处理基础文件系统、存储(或归档)对象、处理几何数据结构(如点和长方形)。

Foundation头文件的存储目录是:

/System/Library/Frameworks/Foundation.framework/Headers

上述头文件实际上与其存储位置的其他目录相链接。请读者查看这个目录中存储在系统上的Foundation框架文档,熟悉它的内容和用法简介。Foundation框架文档存储在我们计算机系统中(位于/Develop/Documentation目录中),另外Apple网站上也提供了此说明文档。大多数文档为HTML格式的文件,可以通过浏览器,同时也提供了Acrobat pdf文件。这个文档中包含Foundation的所有类及其实现的所有方法和函数的描述。

如果正在使用Xcode开发程序,可以通过Xcode的Help菜单中的Documentation窗口轻松访问文档。通过这个窗口,可以轻松搜索和访问存储在计算机本机中或者在线的文档。如果正在Xcode中编辑文件并且想要快速访问某个特定头文件、方法或类的文档,可以通过高亮显示编辑器窗口中的文本并右键单击的方法来实现。在出现的菜单中,可以适当选择Find Selected Text in Documentation或者Find Selected Text in API Reference。Xcode将搜索文档库,并显示与查询相匹配的结果。

看一看它是如何工作的。类NSString是一个Foundation类,可以使用它来处理字符串。假设正在编辑某个使用该类的程序,并且想要获得更多关于这个类及其方法的信息,无论何时,当单词NSString出现在编辑窗口时,都可以将其高亮显示并右键单击。如果从出现的菜单中选择Find Selected Text in API Reference,会得到一个外观与图1-62类似的文档窗口。

如果向下滚动标有NSString Class Reference的面板,将发现(在其他内容中间)一个该类所支持的所有方法的列表。这是一个能够获得有关实现哪些方法等信息的便捷途径,包括它们如何工作以及它们的预期参数。

读者们可以在线访问developer.apple.com/referencelibrary,打开Foundation参考文档(通过Cocoa、Frameworks、Foundation Framework Reference链接),在这个站点中还能够发现一些介绍某些特定编程问题的文档,例如内存管理、字符串和文件管理。除非订阅的是某个特定文档集,否则在线文档要比存储在计算机硬盘中的文档从时间上讲更新一些,如图1-62所示。

在Foundation框架中包括了大量可供使用的类、方法和函数。在Mac OS X上,大约有125个可用的头文件。作为一种简便的形式,我们可以使用如下代码头文件。

#import <Foundation/Foundation.h>

因为Foundation.h文件实际上导入了其他所有Foundation头文件,所以不必担心是否导入了正确的头文件,Xcode会自动将这个头文件插入到程序中。虽然使用上述代码会显著地增加程序的编译时间,但是通过使用预编译的头文件,可以避免这些额外的时间开销。预编译的头文件是经过编译器预先处理过的文件。在默认情况下,所有Xcode项目都会受益于预编译的头文件。在本章使用每个对象时都会用到这些特定的头文件,这会有助于我们熟悉每个头文件所包含的内容。

图1-62 NSString类的文档

 

1.7.2 Cocoa框架简介

Application Kit框架包含广泛的类和方法,它们能够开发交互式图形应用程序,使得开发文本、菜单、工具栏、表、文档、剪贴板和窗口等应用变得十分简便。在Mac OS X操作系统中,术语Cocoa是指Foundation框架和Application kit框架。术语Cocoa Touch是指Foundation框架和UIKit框架。由此可见,Cocoa是一种支持应用程序提供丰富用户体验的框架,它实际上由如下两个框架组成:

Foundation框架;

Application Kit(或AppKit)框架。

其中后者用于提供与窗口、按钮、列表等相关的类。在编程语言中,通常使用示意图来说明框架最顶层应用程序与底层硬件之间的层次,如图1-63所示就是一个这样的图。

图1-63中各个层次的具体说明如下所示。

图1-63 应用程序层次结构

User:用户。

Application:应用程序。

Cocoa(Foundation and AppKit Frameworks):Cocoa(Foundation和AppKit框架)。

Application Services:应用程序服务。

Core Services:核心服务。

Mac OS X kernel:Mac OS X内核。

Computer Resources (memory, disk,display, etc.):计算机资源(内存、磁盘、显示器等)。

内核以设备驱动程序的形式提供与硬件的底层通信,它负责管理系统资源,包括调度要执行的程序、管理内存和电源,以及执行基本的I/O操作。

核心服务提供的支持比它上面层次更加底层或更加“核心”。例如,在Mac OS X中主要了对集合、网络、调试、文件管理、文件夹、内存管理、线程、时间和电源的管理。

应用程序服务层包含对打印和图形呈现的支持,包括Quartz、OpenGL和Quicktime。由此可见,Cocoa层直接位于应用程序层之下。正如图中指出的那样,Cocoa包括Foundation和AppKit框架。Foundation框架提供的类用于处理集合、字符串、内存管理、文件系统、存档等。通过AppKit框架中提供的类,可以管理视图、窗口、文档等用户界面。在很多情况下,Foundation框架为底层核心服务层(主要用过程化的C语言编写)中定义的数据结构定义了一种面向对象的映射。

Cocoa框架用于Mac OS X桌面与笔记本电脑的应用程序开发,而Cocoa Touch框架用于iPhone与iTouch的应用程序开发。Cocoa和Cocoa Touch都有Foundation框架。然而在Cocoa Touch下,UIKit代替了AppKit框架,以便为很多相同类型的对象提供支持,比如窗口、视图、按钮、文本域等。另外,CocoaTouch还提供使用加速器(它与GPS和Wi-Fi信号一样都能跟踪位置)的类和触摸式界面,并且去掉了不需要的类,比如支持打印的类。

 

1.8 常用的第三方工具

在iOS开发应用中,为了提高开发效率,需要借助第三方开发工具。例如测试程序需要模拟器iPhone Simulator,设计界面需要Interface Builder。在本节的内容中,将简单介绍这两个工具的基本知识。

 

1.8.1 iPhone Simulator

iPhone Simulator是iPhone SDK中的最常用工具之一,无需使用实际的iPhone/iPod Touch就可以测试应用程序。iPhone Simulator位于如下文件夹中。

/Developer/iPhone OS <version> /Platforms/iPhoneSimulator.platform/Developer/Applications/

通常不需要直接启动iPhone Simulator,它在Xcode运行(或是调试)应用程序时会自动启动。Xcode会自动将应用程序安装到iPhone Simulator上。iPhone Simulator是一个模拟器,并不是仿真器。模拟器会模仿实际设备的行为。iPhone Simulator会模仿实际的iPhone设备的真实行为。但模拟器本身使用Mac上的QuickTime等库进行渲染,以便效果与实际的iPhone保持一致。此外,在模拟器上测试的应用程序会编译为X86代码,这是模拟器所能理解的字节码。与之相反,仿真器会模仿真实设备的工作方式。在仿真器上测试的应用程序会编译为真实设备所用的实际的字节码。仿真器会把字节码转换为运行仿真器的宿主计算机所能执行的代码形式。

iPhone Simulator可以模拟不同版本的iPhone OS。如果需要支持旧版本的平台以及测试并调试特定版本的OS上的应用程序所报告的错误,该功能就很有用。

启动Xcode后选择左边的iPhone OS下面的Application,然后依次选择“View”→“based Application”,然后为项目命名,如图1-64所示。

在新建的项目中不作任何操作,直接单击“Build and Run”按钮后即可在模拟器中运行程序,如图1-65所示。

 

1.8.2 Interface Builder

Interface Builder(IB)是Mac OS X平台下,用于设计和测试用户界面(GUI)的应用程序(非开源)。为了生成GUI,IB并不是必需的,实际上Mac OS X下所有的用户界面元素都可以使用代码直接生成,但是IB能够使开发者简单快捷地开发出符合Mac OS X human-interface guidelines的GUI。通常只需要通过简单的拖拽(drag-n-drop)操作来构建GUI就可以了。

图1-64 Xcode界面
图1-65 模拟器界面

IB使用Nib文件储存GUI资源,同时适用于Cocoa和Carbon程序。在需要的时候,Nib文件可以被快速地载入内存。Interface Builder是一个可视化工具,用于设计iPhone应用程序的用户界面。可以在Interface Builder中将视图拖拽到窗口上并将各种视图连接到插座变量和动作上,这样它们就能以编程的方式与代码交互。

Interface Builder的设计界面如图1-66所示。

图1-66 Interface Builder界面

 

第6章 使用Xcode编写MVC程序

在本书前面的内容中,已经学习了面向对象编程语言Objective-C的基本知识,并且探索了Cocoa Touch、Xcode和Interface Builder编辑器的基本用法。虽然我们已经使用了多个创建好的项目,但是还没有从头开始创建一个项目。在本章的内容中,将向读者详细讲解“模型—视图—控制器”应用程序的设计模式,并从头到尾创建一个iOS应用程序的过程,为读者步入本书后面知识的学习打下基础。

 

6.1 MVC模式基础

当我们开始编程时,会发现每一个功能都可以用多种编码方式来实现。但是究竟哪一种方式才是最佳选择呢?在开发iOS应用程序的过程中,通常使用的设计方法被称为“模型—视图—控制器”模式,这种模式被简称为MVC,通过这种模式可以帮助我们创建出简洁、高效的应用程序。

 

6.1.1 诞生背景

在创建与用户交互的应用程序时,首先必须考虑如下3点。

用户界面:我们必须提供让用户能够与之交互的东西,例如按钮和文本框等。

对用户输入进行处理并做出反应。

应用程序必须存储必要的信息以便正确地响应用户,这通常是以数据库方式存储的。

为了结合这几个方面,一种方法是将它们合并到一个类中:将显示界面的代码、实现逻辑的代码以及处理数据的代码混合在一起。这是一种非常直观的开发方法,但在多个方面束缚了开发人员。

当众多的代码混合在一起时,多个开发人员难以配合,因为功能单元之间没有明确的界线。不太可能在其他应用程序中重用界面、应用程序逻辑和数据,因为这三方面的组合因项目而异,在其他地方不会有大的用处。总之,混合代码、逻辑和数据将导致混乱。而我们希望iOS应用程序与此相反,解决之道便是使用MVC设计模式。

 

6.1.2 分析结构

MVC最初存在于Desktop程序中,M是指数据模型,V是指用户界面,C则是控制器。使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。

MVC即“模型-视图-控制器”,是Xerox PARC在20世纪80年代为编程语言Smalltalk-80发明的一种软件设计模式,至今已被广泛使用,特别是ColdFusion和PHP的开发者。

MVC是一个设计模式,它能够强制性地使应用程序的输入、处理和输出分开。使用MVC的应用程序被分成3个核心部件,分别是模型、视图、控制器。具体说明如下所示。

1.视图

视图是用户看到并与之交互的界面。对于老式的Web应用程序来说,视图就是由HTML元素组成的界面。在新式的Web应用程序中,HTML依旧在视图中扮演着重要的角色,但一些新的技术已层出不穷,它们包括Adobe Flash和像XHTML、XML/XSL、WML等一些标识语言和Web Services。如何处理应用程序的界面变得越来越有挑战性。MVC一个大的好处是它能为你的应用程序处理很多不同的视图。在视图中其实没有真正的处理发生,不管这些数据是联机存储的还是一个雇员列表,作为视图来讲,它只是作为一种输出数据并允许用户操纵的方式。

2.模型

模型表示企业数据和业务规则。在MVC的3个部件中,模型拥有最多的处理任务。例如它可能用像EJBs和ColdFusion Components这样的构件对象来处理数据库。被模型返回的数据是中立的,就是说模型与数据格式无关,这样一个模型能为多个视图提供数据。由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。

3.控制器

控制器用于接受用户的输入并调用模型和视图去完成用户的需求。所以当单击Web页面中的超链接和发送HTML表单时,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后确定用哪个视图来显示模型处理返回的数据。

现在我们总结MVC的处理过程,首先控制器接收用户的请求,并决定应该调用哪个模型来进行处理,然后模型用业务逻辑来处理用户的请求并返回数据,最后控制器用相应的视图格式化模型返回的数据,并通过表示层呈现给用户。

 

6.1.3 MVC的特点

MVC是所有面向对象程序设计语言都应该遵守的规范,MVC思想将一个应用分成三个基本部分:Model(模型)、View(视图)和Controller(控制器),这三个部分以最少的耦合协同工作,从而提高了应用的可扩展性及可维护性。

在经典的MVC模式中,事件由控制器处理,控制器根据事件的类型改变模型或视图。具体来说,每个模型对应一系列的视图列表,这种对应关系通常采用注册来完成,即把多个视图注册到同一个模型,当模型发生改变时,模型向所有注册过的视图发送通知,然后视图从对应的模型中获得信息,然后完成视图显示的更新。

MVC模式具有如下4个特点。

(1)多个视图可以对应一个模型。按MVC设计模式,一个模型对应多个视图,可以减少代码的复制及代码的维护量,一旦模型发生改变易于维护。

(2)模型返回的数据与显示逻辑分离。模型数据可以应用任何的显示技术,例如,使用JSP页面、Velocity模板或者直接产生Excel文档等。

(3)应用被分隔为3层,降低了各层之间的耦合,提供了应用的可扩展性。

(4)因为在控制层中把不同的模型和不同的视图组合在一起完成不同的请求,由此可见,控制层包含了用户请求权限的概念。

MVC更符合软件工程化管理的精神。不同的层各司其职,每一层的组件具有相同的特征,有利于通过工程化和工具化产生管理程序代码。

 

6.1.4 使用MVC实现程序设计的结构化

通过使用MVC模式,在应用程序的重要组件之间定义了明确的界线。MVC模式定义了应用程序的如下3个部分。

(1)模型提供底层数据和方法,它向应用程序的其他部分提供信息。模型没有定义了应用程序的外观和工作方式。

(2)用户界面由一个或多个视图组成,而视图由不同的屏幕控件(按钮、文本框、开关等)组成,用户可与之交互。

(3)控制器通常与视图配对,负责接受用户输入并做出相应的反应。控制器可访问视图并使用模型提供的信息更新它,还可使用用户在视图中的交互结果来更新模型。总之,它在MVC组件之间搭建了桥梁。

令我们开发者振奋的是,Xcode中的MVC模式是天然存在的,当我们新建项目并开始编码时,会自动被引领到MVC设计模式。由此可见,在Xcode开发环境中可以很容易地创建结构良好的应用程序。

 

6.2 Xcode中的MVC

在用Xcode编程并在Interface Builder中安排用户界面(UI)元素后,Cocoa Touch的结构旨在利用MVC(Model-View-Controller,模型—视图—控制器)设计模式。在本节的内容中,将讲解Xcode中MVC模式的基本知识。

 

6.2.1 原理

MVC模式会将Xcode项目分为如下3个不同的模块。

1.模型

模型是应用程序的数据,比如项目中的数据模型对象类。模型还包括采用的数据库架构,比如CoreData或者直接使用SQLite文件。

2.视图

顾名思义,视图是用户看到的应用程序的可视界面。它包含在Interface Builder中构建的各种UI组件。

3.控制器

控制器是将模型和视图元素连接在一起的逻辑单元,处理用户输入和UI交互。UIKit组件的子类,比如UINavigationController和UITabBarController是最先会被想到的,但是这一概念还扩展到了应用程序委托和NSObject的自定义子类。

虽然在Xcode项目中,上述3个MVC元素之间会有大量交互,但是创建的代码和对象应该简单地定义为仅属于三者之一。当然,完全在代码内生成UI或者将所有数据模型方法存储在控制器类中非常简单,但是如果你的源代码没有良好的结构,会使模型、视图和控制器之间的分界线变得非常模糊。

另外,这些模式的分离还有一个很大的好处是可重用性!在iPad出现之前,应用程序的结构可能不是很重要,特别是不打算在其他项目中重用任何代码的时候。过去我们只为一个规格的设备(iPhone320×480的小屏幕)开发应用程序。但是现在需要将应用程序移植到iPad上,利用平板电脑的新特性和更大的屏幕尺寸。如果iPhone应用程序不遵循MVC设计模式,那么将Xcode项目移植到iPad上会立刻成为一项艰巨的任务,需要重新编写很多代码才能生成一个iPad增强版。

例如,假设根视图控制器类包含所有代码,这些代码不仅用于通过Core Data获取数据库记录,还会动态生成UINavigationController以及一个嵌套的UITableView用于显示这些记录。这些代码在iPhone上可能会良好运行,但是迁移到iPad上后可能想用UISplitViewController来显示这些数据库记录。但是此时需要手动去除所有UINavigationController代码,这样才能添加新的UISplitViewController功能。但是如果将数据类(模型)与界面元素(视图)和控制器对象(控制器)分开,那么将项目移植到iPad的过程会非常轻松。

 

6.2.2 模板就是给予MVC的

Xcode提供了若干模板,这样可以在应用程序中实现MVC架构。

1.view-based application(基于视图的应用程序)

如果应用程序仅使用一个视图,建议使用这个模板。一个简单的视图控制器会管理应用程序的主视图,而界面设置则使用一个Interface Builder模板来定义。特别是那些未使用任何导航功能的简单应用程序应该使用这个模板。如果应用程序需要在多个视图之间切换,建议考虑使用基于导航的模板。

2.navigation-based application(基于导航的应用程序)

基于导航的模板用在需要多个视图之间进行间切换的应用程序。如果可以预见在应用程序中,会有某些画面上带有一个“回退”按钮,此时就应该使用这个模板。导航控制器会完成所有关于建立导航按钮以及在视图“栈”之间切换的内部工作。这个模板提供了一个基本的导航控制器以及一个用来显示信息的根视图(基础层)控制器。

3.utility application(工具应用程序)

适合于微件(Widget)类型的应用程序,这种应用程序有一个主视图,并且可以将其“翻”过来,例如iPhone中的天气预报和股票程序等就是这类程序。这个模板还包括一个信息按钮,可以将视图翻转过来显示应用程序的反面,这部分常常用来对设置或者显示的信息进行修改。

4.OpenGL ES application(OpenGL ES应用程序)

在创建3D游戏或者图形时可以使用这个模板,它会创建一个配置好的视图,专门用来显示GL场景,并提供了一个例子计时器可以令其演示动画。

5.tab bar application(标签栏应用程序)

提供了一种特殊的控制器,会沿着屏幕底部显示一个按钮栏。这个模板适用于像iPod或者电话这样的应用程序,它们都会在底部显示一行标签,提供一系列的快捷方式,来使用应用程序的核心功能。

6.window-based application(基于窗口的应用程序)

提供了一个简单的、带有一个窗口的应用程序。这是一个应用程序所需的最小框架,可以用它作为开始来编写自己的程序。

 

6.3 在Xcode中实现MVC

在本书前面的内容中,已经讲解了Xcode及其集成的Interface Builder编辑器的知识。并且在本书上一章的内容中,曾经将故事板场景中的对象连接到了应用程序中的代码。在本节的内容中,将详细讲解将视图绑定到控制器的知识。

 

6.3.1 视图

在Xcode中,虽然可以使用编程的方式创建视图,但是在大多数情况下是使用Interface Builder以可视化的方式设计它们。在视图中可以包含众多界面元素,在加载运行阶段程序时,视图可以创建基本的交互对象,例如,当轻按文本框时会打开键盘。要让想视图中的对象能够与应用程序实现逻辑交互,必须定义相应的连接。连接的东西有两种:输出口和操作。输出口定义了代码和视图之间的一条路径,可以用于读写特定类型的信息,例如对应于开关的输出口让我们能够访问描述开关是开还是关的信息;而操作定义了应用程序中的一个方法,可以通过视图中的事件触发,例如轻按按钮或在屏幕上轻扫。

如果将输出口和操作连接到代码呢?必须在实现视图逻辑的代码(即控制器)中定义输出口和操作。

 

6.3.2 视图控制器

控制器在Xcode中被称为视图控制器,功能是负责处理与视图的交互工作,并为输出口和操作之间建立一个人为连接。为此需要在项目代码中使用两个特殊的编译指令:IBAction和IBOutlet。IBAction和IBOutlet是Interface Builder能够识别的标记,它们在Objective-C中没有其他用途。我们在视图控制器的接口文件中添加这些编译指令。我们不但可以手工添加,而且也可以用Interface Builder的一项特殊功能自动生成它们。

注意:视图控制器可包含应用程序逻辑,但这并不意味着所有代码都应包含在视图控制器中。虽然在本书中,大部分代码都放在视图控制器中,但当您创建应用程序时,可在合适的时候定义额外的类,以抽象应用程序逻辑。

1.使用IBOutlet

IBOutlet对于编译器来说是一个标记,编译器会忽略这个关键字。Interface Builder则会根据IBOutlet来寻找可以在Builder里操作的成员变量。在此需要注意的是,任何一个被声明为IBOutlet并且在InterfaceBuilder里被连接到一个UI组件的成员变量,会被额外记忆一次,例如:

IBOutlet UILabel *label;

这个label在Interface Builder里被连接到一个UILabel。此时,这个label的retainCount为2。所以,只要使用了IBOutlet变量,一定需要在dealloc或者viewDidUnload中释放这个变量。

IBOutlet的功能是让代码能够与视图中的对象交互。假设在视图中添加了一个文本标签(UILabel),而我们想在视图控制器中创建一个实例“变量/属性”myLabel。此时可以显式地声明它们,也可使用编译指令@property隐式地声明实例变量,并添加相应的属性:

@property (strong, nonatomic) UILabel *myLabel;

这个应用程序提供了一个存储文本标签引用的地方,还提供了一个用于访问它的属性,但还需将其与界面中的标签关联起来。为此,可在属性声明中包含关键字IBOutlet:

@property (strong, nonatomic) IBOutlet UILabel *myLabel;

添加该关键字后,就可以在Interface Builder中以可视化方式将视图中的标签对象连接到变量/属性MyLabel,然后可以在代码中使用该属性与该标签对象交互:修改其文本、调用其方法等。这样,这行代码便声明了实例变量、属性和输出口。

2.使用编译指令property和synthesize简化访问

@property和@synthesize是Objective-C语言中的两个编译指令。实例变量存储的值或对象引用可在类的任何地方使用。如果需要创建并修改一个在所有类方法之间共享的字符串,就应声明一个实例变量来存储它。良好的编程惯例是,不直接操作实例变量。所以要使用实例变量,需要有相应的属性。

编译指令@property定义了一个与实例变量对应的属性,该属性通常与实例变量同名。虽然可以先声明一个实例变量,再定义对应的属性,但是也可以使用@property隐式地声明一个与属性对应的实例变量。例如要声明一个名为myString的实例变量(类型为NSString)和相应的属性,可以编写如下所示的代码实现:

@property (strong, nonatomic) NSString *myString;

这与下面两行代码等效:

NSString *myString;

@property (strong, nonatomic) NSString *myString;

注意:Apple Xcode工具通常建议隐式地声明实例变量,所以建议大家也这样做。

这同时创建了实例变量和属性,但是要想使用这个属性则必须先合成它。编译指令@synthesize创建获取函数和设置函数,让我们很容易访问和设置底层实例变量的值。对于接口文件(.h)中的每个编译指令@property,实现文件( .m)中都必须有对应的编译指令@synthesize:

@synthesize myString;

3.使用IBAction

IBAction用于指出在特定的事件发生时应调用代码中相应的方法。假如按下了按钮或更新了文本框,则可能想应用程序采取措施并做出合适的反应。编写实现事件驱动逻辑的方法时,可在头文件中使用IBAction声明它,这将向Interface Builder编辑器暴露该方法。在接口文件中声明方法(实际实现前)被称为创建方法的原型。

例如,方法doCalculation的原型可能类似于下面的情形:

-(IBAction)doCalculation: (id) sender;

注意到该原型包含一个sender参数,其类型为id。这是一种通用类型,当不知道(或不需要知道)要使用的对象的类型时可以使用它。通过使用类型id,可以编写不与特定类相关联的代码,使其适用于不同的情形。创建将用作操作的方法(如doCalculation)时,可以通过参数sender确定调用了操作的对象并与之交互。如果要设计一个处理多种事件(如多个按钮中的任何一个按钮被按下)的方法,这将很方便。

 

6.4 数据模型

Core Data抽象了应用程序和底层数据存储之间的交互。它还包含一个Xcode建模工具,该工具像Interface Builder那样可帮助我们设计应用程序,但不是让我们能够以可视化的方式创建界面,而是让我们以可视化方式建立数据结构。Core Data是Cocoa中处理数据、绑定数据的关键特性,其重要性不言而喻,但也比较复杂。

下面先给出一张如图6-1所示的类关系图。

图6-1 类关系图

在图6-1中,我们可以看到有如下五个相关的模块。

(1)Managed Object Model。

Managed Object Model是描述应用程序的数据模型,这个模型包含实体(Entity)、特性(Property),读取请求(Fetch Request)等。

(2)Managed Object Context。

Managed Object Context参与对数据对象进行各种操作的全过程,并监测数据对象的变化,以提供对 undo/redo 的支持及更新绑定到数据的 UI。

(3)Persistent Store Coordinator。

Persistent Store Coordinator 相当于数据文件管理器,处理底层的对数据文件的读取与写入,一般我们无需与它打交道。

(4)Managed Object Managed Object数据对象。

与 Managed Object Context相关联。

(5)Controller图中绿色的Array Controller、Object Controller和Tree Controller。

这些控制器一般都是通过“control+drag”将Managed Object Context绑定到它们,这样就可以在 nib中以可视化地方式操作数据。

上述模块的运作流程如下所示。

(1)应用程序先创建或读取模型文件(后缀为xcdatamodeld)生成 NSManagedObjectModel 对象。Document应用程序是一般是通过 NSDocument 或其子类 NSPersistentDocument)从模型文件(后缀为xcdatamodeld)读取。

(2)然后生成 NSManagedObjectContext 和 NSPersistentStoreCoordinator 对象,前者对用户透明地调用后者对数据文件进行读写。

(3)NSPersistentStoreCoordinator从数据文件(XML、SQLite、二进制文件等)中读取数据生成 Managed Object,或保存Managed Object写入数据文件。

(4)NSManagedObjectContext对数据进行各种操作的整个过程,它持有 Managed Object。我们通过它来监测 Managed Object。监测数据对象有两个作用:支持 undo/redo 以及数据绑定。这个类是最常被用到的。

(5)Array Controller、Object Controller和Tree Controller等控制器一般与 NSManagedObjectContext 关联,因此可以通过它们在nib 中可视化地操作数据对象。

 

6.5 实战演练——使用模板Single View Application

Apple在Xcode中提供了一种很有用的应用程序模板,可以快速地创建一个这样的项目,即包含一个故事板、一个空视图和相关联的视图控制器。模板Single View Application(单视图应用程序)是最简单的模板,在本节的内容中将创建一个应用程序,本程序包含了一个视图和一个视图控制器。本节的实例非常简单,先创建了一个用于获取用户输入的文本框(UITextField)和一个按钮,当用户在文本框中输入内容并按下按钮时,将更新屏幕标签(UILabel)以显示Hello和用户输入。虽然本实例程序比较简单,但是几乎包含了本章讨论的所有元素:视图、视图控制器、输出口和操作。

 

6.5.1 创建项目

首先在Xcode中新建一个项目,并将其命名为“hello”。

(1)从文件夹Developer/Applications或Launchpad的Developer编组中启动Xcode。

(2)启动后在左侧导航选择第一项“Create a new Xcode project”,如图6-2所示。

(3)在弹出的新界面中选择项目类型和模板。在New Project窗口的左侧,确保选择了项目类型iOS中的Application,在右边的列表中选择Single View Application,再单击“Next”按钮,如图6-3所示。

图6-2 新建一个 Xcode工程
图6-3 选择Single View Application

1.类文件

展开项目代码编组(名为HelloNoun),并查看其内容。会看到如下5个文件:

AppDelegate.h;

AppDelegate.m;

ViewController.h;

ViewController.m;

MainStoryboard.storyboard。

其中文件AppDelegate.h和AppDelegate.m组成了该项目将创建的UIApplication实例的委托,也就是说我们可以对这些文件进行编辑,以添加控制应用程序运行时如何工作的方法。我们可以修改委托,在启动时执行应用程序级设置、告诉应用程序进入后台时如何做以及应用程序被迫退出时该如何处理。就本章这个演示项目来说,我们不需要在应用程序委托中编写任何代码,但是需要记住它在整个应用程序生命周期中扮演的角色。

其中文件AppDelegate.h的代码如下:

#import <UIKit/UIKit.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

@end

文件AppDelegate.m的代码如下所示:

//

// AppDelegate.m

// hello

//

// Created by on 12-9-17.

// Copyright (c) 2012年 apple. All rights reserved.

//

#import "AppDelegate.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:

(NSDictionary *)launchOptions

{

//Override point for customization after application launch.

return YES;

}

- (void)applicationWillResignActive:(UIApplication *)application

{

//Sent when the application is about to move from active to inactive state. This

can occur for certain types of temporary interruptions (such as an incoming phone call

or SMS message) or when the user quits the application and it begins the transition to

the background state.

// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL

ES frame rates. Games should use this method to pause the game.

}

- (void)applicationDidEnterBackground:(UIApplication *)application

{

//Usethismethodtoreleasesharedresources,saveuserdata,invalidatetimers,

and store enough application state information to restore your application to its current

state in case it is terminated later.

// If your application supports background execution, this method is called instead

of applicationWillTerminate: when the user quits.

}

- (void)applicationWillEnterForeground:(UIApplication *)application

{

//Calledaspartofthetransitionfromthebackgroundtotheinactivestate;here

you can undo many of the changes made on entering the background.

}

- (void)applicationDidBecomeActive:(UIApplication *)application

{

//Restartanytasksthatwerepaused(ornotyetstarted)whiletheapplicationwas

inactive. If the application was previously in the background, optionally refresh the

user interface.

}

- (void)applicationWillTerminate:(UIApplication *)application

{

//Calledwhentheapplicationisabouttoterminate.Savedataifappropriate.See

// also applicationDidEnterBackground:.

}

@end

上述两个文件的代码都是自动生成的。

文件ViewController.h和ViewController.m实现了一个视图控制器(UIViewController),这个类包含控制视图的逻辑。一开始这些文件几乎是空的,只有一个基本结构,此时如果您单击Xcode窗口顶部的Run按钮,应用程序将编译并运行,运行后一片空白,如图6-4所示。

注意:如果在Xcode中新建项目时指定了类前缀,所有类文件名都将以您指定的内容打头。在以前的Xcode版本中,Apple将应用程序名作为类的前缀。要让应用程序有一定的功能,需要处理前面讨论过的两个地方:视图和视图控制器。

2.故事板文件

除了类文件之外,该项目还包含了一个故事板文件,它用于存储界面设计。单击故事板文件 MainStoryboardstoryboard,在Interface Builder编辑器中打开它,如图6-5所示。

图6-4 执行后为空
图6-5 MainStoryboardstoryboard界面

在MainStoryboard.storyboard界面中包含了如下3个图标:

First Responder(一个UIResponder实例);

View Controller(我们的ViewController类);

应用程序视图(一个UIView实例)。

视图控制器和第一响应者还出现在图标栏中,该图标栏位于编辑器中视图的下方。如果在该图标栏中没有看到图标,只需单击图标栏,它们就会显示出来。

当应用程序加载故事板文件时,其中的对象将被实例化,成为应用程序的一部分。就本项目“hello”来说,当它启动时会创建一个窗口并加载MainStoryboard.storyboard,实例化ViewController类及其视图,并将其加入到窗口中。

在文件HelloNoun-Info.plist中,通过属性Main storyboard file base name(主故事板文件名)指定了加载的文件是MainStoryboard.storyboard。要想核实这一点,读者可展开文件夹Supporting Files,再单击plist文件显示其内容。另外也可以单击项目的顶级图标,确保选择了目标“hello”,再查看选项卡Summary中的文本框Main Storyboard,如图6-6所示。

如果有多个场景,在Interface Builder编辑器中会使用很不明显的方式指定了初始场景。在前面的图6-6中,会发现编辑器中有一个灰色箭头,它指向视图的左边缘。这个箭头是可以拖动的,当有多个场景时可以拖动它,使其指向任何场景对应的视图。这就自动配置了项目,使其在应用程序启动时启动该场景的视图控制器和视图。

总之,对应用程序进行了配置,使其加载MainStoryboard.storyboard,而MainStoryboard.storyboard查找初始场景,并创建该场景的视图控制器类(文件ViewController.h和ViewController.m定义的ViewController)的实例。视图控制器加载其视图,而视图被自动添加到主窗口中。

图6-6 指定应用程序启动时将加载的故事板

 

6.5.2 规划变量和连接

要创建该应用程序,第一步是确定视图控制器需要的东西。为引用要使用的对象,必须与如下3个对象进行交互:

一个文本框(UITextField);

一个标签(UILabel);

一个按钮(UIButton)。

其中前两个对象分别是用户输入区域(文本框)和输出(标签),而第3个对象(按钮)触发代码中的操作,以便将标签的内容设置为文本框的内容。

1.修改视图控制器接口文件

基于上述信息,便可以编辑视图控制器类的接口文件(ViewController.h),在其中定义需要用来引用界面元素的实例变量以及用来操作它们的属性(和输出口)。我们将把用于收集用户输入的文本框(UITextField)命名为user@property将提供输出的标签(URLabel)命名为userOutput。前面说过,通过使用编译指令@property可同时创建实例变量和属性,而通过添加关键字IBoutlet可以创建输出口,以便在界面和代码之间建立连接。

综上所述,可以添加如下两行代码:

@property (strong, nonatomic) IBOutlet UILabel *userOutput;

@property (strong, nonatomic) IBOutlet UITextField *userInput;

为了完成接口文件的编写工作,还需添加一个在按钮被按下时执行的操作。我们将该操作命名为setOutput:

- (IBAction)setOutput: (id)sender;

添加这些代码后,文件ViewController.h的代码如下所示。其中以粗体显示的代码行是我们新增的:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@property (strong, nonatomic) IBOutlet UILabel *userOutput;

@property (strong, nonatomic) IBOutlet UITextField *userInput;

- (IBAction)setOutput:(id)sender;

@end

但是这并非我们需要完成的全部工作。为了支持我们在接口文件中所做的工作,还需对实现文件(ViewController.m)做一些修改。

2.修改视图控制器实现文件

对于接口文件中的每个编译指令@property来说,在实现文件中都必须有如下对应的编译指令@synthesize:

@synthesize userInput;

@synthesize userOutput;

将这些代码行加入到实现文件开头,并位于编译指令@implementation后面,文件ViewController.m中对应的实现代码如下所示:

#import "ViewController.h"

@implementation ViewController

@synthesize userOutput;

@synthesize userInput;

在确保使用完视图后,应该使代码中定义的实例变量(即userInput 和userOutput)不再指向对象,这样做的好处是这些文本框和标签占用的内存可以被重复重用。实现这种方式的方法非常简单,只需将这些实例变量对应的属性设置为nil即可:

[self setUserlnput:nil];

[self setUserOutput:nil];

上述清理工作是在视图控制器的一个特殊方法中进行的,这个方法名为viewDidUnload,在视图成功地从屏幕上删除时被调用。为添加上述代码,需要在实现文件ViewController.h中找到这个方法,并添加代码行。同样,这里演示的是如果要手工准备输出口、操作、实例变量和属性时,需要完成的设置工作。

文件ViewController.m中对应清理工作的实现代码如下所示:

- (void)viewDidUnload

{

self.userInput=nil;

self.userOutput = nil;

[self setUserOutput:nil];

[self setUserInput:nil];

[super viewDidUnload];

// Release any retained subviews of the main view.

// e.g. self.myOutlet = nil;

}

注意:如果浏览HelloNoun的代码文件,可能发现其中包含绿色的注释(以字符“//”打头的代码行)。为节省篇幅,通常在本书的程序清单中删除了这些注释。

3.一种简化的方法

虽然还没有输入任何代码,但还是希望能够掌握规划和设置Xcode项目的方法。所以还需要做如下所示的工作。

确定所需的实例变量:哪些值和对象需要在类(通常是视图控制器)的整个生命周期内都存在。

确定所需的输出口和操作:哪些实例变量需要连接到界面中定义的对象?界面将触发哪些方法?

创建相应的属性:对于您打算操作的每个实例变量,都应使用@property来定义实例变量和属性,并为该属性合成设置函数和获取函数。如果属性表示的是一个界面对象,还应在声明它时包含关键字IBOutlet。

清理:对于在类的生命周期内不再需要的实例变量,使用其对应的属性将其值设置为nil。对于视图控制器中,通常是在视图被卸载时(即方法viewDidUnload中)这样做。

当然我们可以可手工完成这些工作,但是在Xcode中使用Interface Builder编辑能够在建立连接时添加编译指令@property和@synthesize、创建输出口和操作、插入清理代码。

将视图与视图控制器关联起来的是前面介绍的代码,但您可在创建界面的同时让Xcode自动为我们编写这些代码。创建界面前,仍然需要确定要创建的实例变量/属性、输出口和操作,而有时候还需添加一些额外的代码,但让Xcode自动生成代码可极大地加快初始开发阶段的进度。

 

6.5.3 设计界面

添加对象

本节的演示程序“hello”的界面很简单,只需提供一个输出区域、一个用于输入的文本框以及一个将输出设置成与输入相同的按钮。请按如下步骤创建该UI。

(1)在Xcode项目导航器中选择MainStoryboard.storyboard,并打开它。

(2)打开它的是Interface Builder编辑器。其中文档大纲区域显示了场景中的对象,而编辑器中显示了视图的可视化表示。

(3)选择菜单View>Utilities>Show Object Library(Control+Option+Command+3),在右边显示对象库。在对象库中确保从下拉列表中选择了Objects,这样将显示可拖放到视图中的所有控件,此时的工作区类似于图6-7所示。

图6-7 初始界面

(4)通过在对象库中单击标签(UILabel)对象并将其拖曳到视图中,在视图中添加两个标签。

(5)第一个标签应包含静态文本Hello,为此该标签的双击默认文本Label并将其改为“你好”。选择第二个标签,它将用作输出区域。这里将该标签的文本改为“请输入信息”。将此作为默认值,直到用户提供新字符串为止。我们可能需要增大该文本标签以便显示这些内容,为此可单击并拖曳其手柄。

我们还要将这些标签居中对齐,此时可以通过单击选择视图中的标签,再按下Option+ Command+4或单击Utility区域顶部的滑块图标,这将打开标签的Attributes Inspector。

使用Alignment选项调整标签文本的对齐方式。另外还可能会使用其他属性来设置文本的显示样式,例如字号、阴影、颜色等。现在整个视图应该包含两个标签。

(6)如果对结果满意,便可以添加用户将与之交互的元素文本框和按钮。为了添加文本框,在对象库中找到文本框对象(UITextField),单击并将其拖曳到两个标签下方。使用手柄将其增大到与输出标签等宽。

(7)再次按Option+Command+4打开Attributes Inspector,并将字号设置成与标签的字号相同。注意到文本框并没有增大,这是因为默认iPhone文本框的高度是固定的。要修改文本框的高度,在Attributes Inspector中单击包含方形边框的按钮Border Style,然后便可随意调整文本框的大小。

(8)在对象库单击圆角矩形按钮(UIButton)并将其拖曳到视图中,将其放在文本框下方。双击该按钮给它添加一个标题,如Set Label;再调整按钮的大小,使其能够容纳该标题。您也可能想使用Attributes Inspector增大文本的字号。

最终UI界面效果如图6-8所示,其中包含了4个对象,分别是两个标签、1个文本框和1个按钮。

图6-8 最终的UI界面

 

6.5.4 创建并连接输出口和操作

现在,在Interface Builder编辑器中需要做的工作就要完成了,最后一步工作是将视图连接到视图控制器。如果按前面介绍的方式手工定义了输出口和操作,则只需在对象图标之间拖曳即可。但即使就地创建输出口和操作,也只需执行拖放操作。

为此,需要从Interface Builder编辑器拖放到代码中这需要添加输出口或操作的地方,即需要能够同时看到接口文件VeiwController.h和视图。在Interface Builder编辑器中还显示了刚设计的界面的情况下,单击工具栏的Edit部分的Assistant Editor按钮,这将在界面右边自动打开文件ViewController.h,因为Xcode知道我们在视图中必须编辑该文件。

另外,如果我们使用的开发计算机是MacBook,或编辑的是iPad项目,屏幕空间将不够用。为了节省屏幕空间,单击工具栏中View部分最左边和最右边的按钮,以隐藏Xcode窗口的导航区域和Utility区域。您也可以单击Interface Builder编辑器左下角的展开箭头将文档大纲区域隐藏起来。这样屏幕将类似于如图6-9所示。

图6-9 切换工作空间

1.添加输出口

下面首先连接用于显示输出的标签。前面说过,我们想用一个名为userOutput的实例变量/属性表示它。

(1)按住Control键,并拖曳用于输出的标签(在这里,其标题为<请输入信息>)或文档大纲中表示它的图标。将其拖曳到包含文件ViewController.h的代码编辑器中,当鼠标位于@interface行下方时松开。当您拖曳时,Xcode将指出如果您此时松开鼠标将插入什么,如图6-10所示。

图6-10 生成代码

(2)当松开鼠标时会要求我们定义输出口。接下来首先确保从下拉列表Connection中选择了Outlet,从Storage下拉列表中选择了Strong,并从Type下拉列表中选择了UILabel。最后指定我们要使用的实例“变量/属性”名(userOutput),最后再单击Connect按钮,如图6-11所示。

(3)当单击Connect按钮时,Xcode将自动插入合适的编译指令@property和关键字IBOut:put(隐式地声明实例变量)、编译指令@synthesize(插入到文件ViewController.m中)以及清理代码(也是文件ViewController.m中)。更重要的是,还在刚创建的输出口和界面对象之间建立连接。

(4)对文本框重复上述操作过程。将其拖曳至刚插入的@property代码行下方,将Type设置为UITextField,并将输出口命名为userInput。

图6-11 配置创建的输出口

2.添加操作

添加操作并在按钮和操作之间建立连接的方式与添加输出口相同。唯一的差别是在接口文件中,操作通常是在属性后面定义的,因此您需要拖放到稍微不同的位置。

(1)按住Control键,并将视图中的按钮拖曳到接口文件(ViewController.h)中刚添加的两个@property编译指令下方。同样,当您拖曳时,Xcode将提供反馈,指出它将在哪里插入代码。拖曳到要插入操作代码的地方后,松开鼠标。

(2)与输出口一样,Xcode将要求您配置连接,如图6-12所示。这次,务必将连接类型设置为Action,否则Xcode将插入一个输出口。将Name(名称)设置为setOutput(前面选择的方法名)。务必从下拉列表Event中选择Touch Up Inside,以指定将触发该操作的事件。保留其他默认设置,并单击Connect按钮。

图6-12 配置要插入到代码中的操作

到此为止,我们成功添加了实例变量、属性、输出口,并将它们连接到了界面元素。在最后我们还需要重新配置我们的工作区,确保项目导航器可见。

 

}

}

6.5.5 实现应用程序逻辑

创建好视图并建立到视图控制器的连接后,接下来的唯一任务便是实现逻辑。现在将注意力转向文件ViewController.m以及setOutput的实现上。setOutput方法将输出标签的内容设置为用户在文本框中输入的内容。我们如何获取并设置这些值呢?UILabel和UITextField都有包含其内容的text属性,通过读写该属性,只需一个简单的步骤便可将userOutput的内容设置为userInput的内容。

打开文件ViewController.m并滚动到末尾,会发现Xcode在创建操作连接代码时自动编写了空的方法定义(这里是setOutput),我们只需填充内容即可。找到方法setOutput,其实现代码如下所示:

- (IBAction)setOutput:(id)sender {

// [[self userOutput]setText:[[self userInput] text]];

self.userOutput.text=self.userInput.text;

}

通过这条赋值语句便完成了所有的工作。

接下来我们整理核心文件ViewController.m的实现代码:

#import "ViewController.h"

@implementation ViewController

@synthesize userOutput;

@synthesize userInput;

- (void)didReceiveMemoryWarning

{

[super didReceiveMemoryWarning];

// Release any cached data, images, etc that aren't in use.

#pragma mark - View lifecycle

- (void)viewDidLoad

{

[super viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

}

- (void)viewDidUnload

{

self.userInput=nil;

self.userOutput = nil;

[self setUserOutput:nil];

[self setUserInput:nil];

[super viewDidUnload];

// Release any retained subviews of the main view.

// e.g. self.myOutlet = nil;

}

- (void)viewWillAppear:(BOOL)animated

{

[super viewWillAppear:animated];

}

- (void)viewDidAppear:(BOOL)animated

{

[super viewDidAppear:animated];

}

- (void)viewWillDisappear:(BOOL)animated

{

[super viewWillDisappear:animated];

}

- (void)viewDidDisappear:(BOOL)animated

{

[super viewDidDisappear:animated];

-

(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrien

tation

{

//Return YES for supported orientations

return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);

}

- (IBAction)setOutput:(id)sender {

// [[self userOutput]setText:[[self userInput] text]];

self.userOutput.text=self.userInput.text;

}

@end

上述代码几乎都是用Xcode自动实现的。

 

6.5.6 生成应用程序

现在可以生成并测试我们的演示程序了,执行后的效果如图6-13所示。在文本框中输入信息并单击“单击我”按钮后,会在上方显示我们输入的文本,如图6-14所示。

图6-13 执行效果
图6-14 显示输入的信息

图书在版编目(CIP)数据

iOS 8开发指南/管蕾编著.--北京:人民邮电出版社,2014.10

ISBN 978-7-115-36845-4

Ⅰ.①i… Ⅱ.①管… Ⅲ.①移动终端—应用程序—程序设计  Ⅳ.①TN929.53

中国版本图书馆CIP数据核字(2014)第184293号

内容提要

苹果公司的iOS系统从诞生之日起到现在,在短短几年时间内,凭借内置有iOS系统的iPhone和iPad的很好的用户体验,赢得了广大消费者和在iOS上开发的程序员的青睐。目前,iOS系统一直在智能手机操作系统中占有重要的优势地位。

全书共34章,循序渐进地讲解了iOS 8应用开发的基本知识。本书从搭建开发环境讲起,依次讲解了Objective-C语言基础、Swift语言基础、Cocoa Touch、Xcode Interface Builder界面开发、使用Xcode编写MVC程序、文本框和文本视图、按钮和标签、滑块、步进和图像、使用开关控件和分段控件、Web视图控件和可滚动视图控件、提醒和操作表、工具栏、日期选择器、表视图、活动指示器、进度条和检索条、UIView详解、视图控制器、实现多场景和弹出框、iPad弹出框和分割视图控制器、界面旋转、图形、图像、图层和动画、声音服务、多媒体应用、定位处理、读写应用程序数据、触摸和手势识别、和硬件之间的操作、开发通用的项目程序、推服务和多线程、Touch ID详解、游戏开发等高级知识。本书内容全面,几乎涵盖了iOS 8应用开发所需要的主要内容,全书内容言简意赅,讲解方法通俗易懂,特别适合于初学者学习。

本书适合iOS初学者、iOS程序员、iPhone开发人员、iPad开发人员学习,也可以作为相关培训学校和大专院校相关专业的教学用书。

◆编著 管蕾

责任编辑 张涛

责任印制 彭志环 焦志炜

◆人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 htp:/www.ptpress.com.cn

北京艺辉印刷有限公司印刷

◆开本:787×1092 1/16

印张:48.5

字数:1436千字  2014年10月第1版

印数:1-3000册  2014年10月北京第1次印刷

定价:99.00元(附光盘)

读者服务热线:(010) 81055410 印装质量热线:(010) 81055316

反盗版热线:(010) 81055315

相关图书

iOS 14开发指南【进QQ群414744032索取配套资源】
iOS 14开发指南【进QQ群414744032索取配套资源】
iOS 11 开发指南
iOS 11 开发指南
iOS和tvOS 2D游戏开发教程
iOS和tvOS 2D游戏开发教程
Swift 3开发指南
Swift 3开发指南
iOS  项目开发全程实录
iOS 项目开发全程实录
iOS 10 开发指南
iOS 10 开发指南

相关文章

相关课程