iOS开发基础教程(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-16 18:21:37

点击下载

作者:黄海

出版社:人民邮电出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

iOS开发基础教程

iOS开发基础教程试读:

前言

FOREWORD

2007年1月iPhone的诞生,引发了智能手机的革命,移动互联网浪潮席卷整个世界。如今人们的生活处处离不开智能手机,各类App已经深入人们的生活,人们开始习惯在手机上娱乐与消费,兴趣从桌面计算机全面地转向手机。苹果公司在智能手机市场中占据了相当比例的份额。很多公司开发产品,都是先开发苹果版,之后再做安卓版,因此iOS开发的重要性不言而喻。

然而各大院校,虽然有软件专业、移动应用开发专业,但都以Android开发为主,极少以iOS为主要教育方向的,这其中固然有硬件、成本等方面的原因,但有一个事实不能忽略,即缺乏合适的应用型教材。本书正由此而生。

本书共13章,从最基础的内容开始讲起,到讲完iOS的界面交互代码编写,着重于以纯代码方式构建各个界面,既要保证内容的质量,也不至于篇幅泛滥。各章节都配套了相关的源代码,方便读者学习使用。在各章节的末尾还设置了作业,供延展知识和练习使用。

iOS界面构建时,超过50%的工作都要用到UITableView,它是iOS精心设计、功能强大的视图控件,因此本书也花了最大的篇幅来详细讲解,读者宜多花心思钻研该控件。

可视化界面构建方面,使用Storyboard和自动约束的相关内容,已经足够再写一本书,因而本书只是大概涉及,毕竟掌握了纯代码的构建方式,再学可视化构建将手到擒来。

网络连接方面本书也未涉及,因涉及网络的各方面知识还有数据解析,均需大量篇幅,因此作罢,若掌握本书内容后,可自学掌握。

苹果公司每年都会更新iOS版本,本书出版时为iOS 10,使用开发工具为Xcode 8,所有的代码都在该平台下运行通过。

本书所涉及的PPT和源代码文件可从出版社网站(www.ryjiaoyu.com)下载使用。编者2017年11月第1章iOS开发环境介绍1.1 开发前准备

首先需要准备一台Mac计算机,装上Mac OS X操作系统,本书定稿时,最新版Mac OS为10.12 Sierra。Mac OS X自版本10.10及以后的版本都是免费的,没有Mac计算机的话,在某些普通PC上可以安装所谓的“黑苹果”来开发,只是操作体验没有Mac计算机好。1.1.1 iOS介绍

iOS是由苹果公司开发的移动操作系统。2007年iPhone诞生,当时的操作系统还不叫iOS,而是“iPhone OS”,直到2010年iPad诞生后,因为使用同一个系统,因此才改名为“iOS”。iOS一般每年进行一次大的升级,本书写作时,iOS 10为最新正式版。

iOS是iPhone、iPad、iPod Touch等苹果设备的灵魂,正是有了iOS,苹果产品的使用体验才出类拔萃,目前国内很多安卓App的风格,均受iOS的影响。1.1.2 Mac OS介绍

Mac OS的历史非常悠久,20世纪 80年代就有了,其率先实现了窗口系统,并影响了微软的Windows的设计。Mac OS自乔布斯回归苹果后,架构发生了很大的改变,使用了NextStep(乔布斯出走苹果后创办的一家软件公司的名字)的软件,现在的Cocoa (即苹果官方开发框架之名)库中的众多NS开头的方法,就是NextStep的首字母缩写,尤其苹果产品转用intel CPU后,将底层的内核改为UNIX,与Free BSD(UNIX移植到普通PC后的一个衍生系统,非常著名,与之齐名的还有Net BSD、Open BSD)的关系最为接近,自此Mac OS开始在程序员中非常流行,因为其既有着华丽而舒适的操作界面,又接上了UNIX的地气,拥有了众多UNIX/Linux软件的支持,因而非常受开发人员的青睐。

另外,众所周知的开源(即公开源代码)软件运动,就是自UNIX闭源开始的,20世纪的一群黑客,为了摆脱闭源以及专利的束缚,以Richard Stallman(理查德·斯托曼)为首带头发起了开源运动,其创办了“自由软件基金会”(Free Software Foundation),组织了 GNU 项目,将 UNIX 的软件一一重写,企图制作一个完整的、开源的、完全自由的类UNIX操作系统。在这些突破的基础上,开源软件轰轰烈烈地一直健康发展到如今,连微软都不得不选择开源。Mac OS建立在UNIX之上之后,拥有了完备的UNIX基础,对接上了这众多的开源软件,比较而言,Windows平台却显得不方便了。1.1.3 开发之软硬件环境要求

类似微软公司鼎鼎大名的Visual Studio,苹果公司同样为开发人员准备了统一的免费的开发环境——Xcode。其功能很强大,本书所有的示例代码均在Xcode之下开发。

综上所述,开发需要的软件环境为:Mac OS X + Xcode,硬件则需要Mac计算机,或者可以安装“黑苹果”的PC。1.2 Xcode集成开发环境的安装与使用1.2.1 下载与安装Xcode

最简单的方法是打开Mac OS X 的 App Store,在其中搜索Xcode,如图1-1所示。图1-1 Mac App Store

随后只需简单地选择安装即可,或者直接去苹果官网下载亦可。1.2.2 Xcode界面布局与功能介绍

Xcode界面如图1-2所示。图1-2 Xcode界面

与一般的IDE布局差不多,左边是项目文件树列表,中间是编辑代码区域,下面是调试信息展示,右边上面是一些选项调整和帮助信息,下面是一些额外功能及控件列表等,并可以自由定义哪些界面不显示。1.2.3 Xcode常用快捷键

掌握快捷键对于快速的开发是非常有用的。

首先,编辑快捷键默认是Emacs格式的,比如:

contro+A光标移动到行首;

contro +E光标移动到行尾;

contro +P光标移动到上一行;

contro +N光标移动到下一行;

contro +K从光标位置到行尾的内容都删除;

contro +K删除当前行。

注:在PC键盘上contro键等同于Ctrl键

复制粘贴操作则是:

command+A全选;

command+C复制;

command+V粘贴;

command+X剪切。

其他快捷键:

command+单击找到光标下的符号的定义(重要!最常用);

command+R运行。

基本上掌握了这些快捷键就够用了。1.3 Objective C语言和Swift语言1.3.1 Objective C语言介绍

不同于市面上其他流行的语言,Objective C 语言是因为苹果公司才发展壮大的。其语言的特点与其他的主流语言相差较大,但是功能一点都不弱,用习惯了非常方便。Objective C语言与C++都是通过给C语言加上面向对象功能发展而来,C++的体量已经庞大到和C语言差不多,而Objective C却保持了小巧的体积。Objective C更多的是借鉴了面向对象语言 smallTalk 的特点,强调对象之间通过发送消息来通信,其独特的方括号语法处处都有,比如:[object reload] 表示向object 对象发送一个名为reload的消息(reload实质上是object 对象的一个方法)。1.3.2 Swift语言介绍

Swift是苹果公司于2014年6月的WWDC大会上发布的一种新语言,由苹果公司完全开发,未来将替代Objective C。Swift像脚本语言,但又拥有编译运行的速度,拥有很多现代语言的特征,非常适合于快速开发。但从目前来看,2 年多的时间,Swift 发展到3.0版本,语法变化很大,而且不能向前兼容,导致之前用Swift 2.0编写的代码必须大量修改才能运行(当然苹果公司在Xcode 8提供了自动转换新语法的功能,但是仍然不能完全转换,需人工介入),因此Swift语言短时间内还替代不了Objective C。1.4 如何使用文档及获取帮助1.4.1 Xcode帮助文档的使用

在代码中,可以按住Command键不放,此时用鼠标单击某类或者变量,可以跳到其定义处。读者可以通过这种方式查看Cocoa类的头文件,查看有哪些属性和方法,这对于熟悉某个类的使用方法非常有帮助。

还有一种方法,鼠标停留在某处时,查看Xcode右边的帮助界面,如图1-3所示。图1-3 Xcode帮助

右边的帮助界面,显示为鼠标此时所在位置(一般为类名、方法名等,图1-3中鼠标位置在最下面红圈处的initWithItems方法处)的帮助内容,可以单击其中蓝色的链接进行详细查看。1.4.2 开发中遇到问题如何寻求帮助

开发App时,会不可避免地遇到难以解决的问题或错误。如果通过调试始终不能找到错误所在,第一种方法是把错误信息复制到搜索引擎进行搜索。一般而言,谷歌的搜索结果最好,但是因为某种原因,谷歌在中国大陆不能使用,可以代之以微软的搜索引擎“必应”(http://www.bing.com),百度的结果相对差点。

第二种方法是上论坛提问。这方面的资料一般国外的多,最有名的当属Stack Overflow (http://www.stackoverflow.com),通常别的地方找不到的问题这上面都有。国内的有cocoa china(http://www.cocoachina.com)较为不错。

第三种方法是找一些iOS开发方面的qq群。

第四种方法是上github(http://www.github.com),它可以说是现在世界上最大的开源项目中心,还有无数的第三方库可供使用。有些问题,自己不好解决,完全可以通过第三方库来解决。另外,通过这些开源的项目,可以学习到高手的代码,对提高自己非常有用。1.4.3 提问的方式

在网上求助时,要注意提问的方式。要把环境描述清楚,把错误信息粘贴完整,并突出重点。他人没有义务一定解答,所以要为别人考虑,尽量把信息组织得清晰易懂,他人提供帮助时也更加方便。

笔者曾经使用github的一个世界著名的开源库YYKit,使用中发现了一些bug,当即在github的该项目的主页上报告了该bug(在issue选项卡中报告),因为描述得很详细,错误定位得很清楚,该项目维护者在当天就回应并解决了该错误,提交了新版本代码。1.5 iOS程序调试、打包与发布到App Store1.5.1 苹果开发人员计划

作为开发者,我们首先得有一个Apple ID(开发者账号),然后去https://developer.Apple.com申请开发人员身份。

iOS的开发,仅在模拟器上运行,是免费的,从2014年后,在真机上运行,也免费了,但如果需要发布到App Store上进行销售,需要申请开发人员计划,这个就不是免费的了。

从2015年6月的WWDC大会之后,苹果的开发人员计划进行了合并,只区分个人开发者和企业开发者,其中个人开发者一年需向苹果公司缴纳99美元或人民币688元的费用,企业开发者则需要缴纳299美元。企业开发者可以开发私有App,但不能通过App Store分发,只能通过网站的方式在企业内部分发。个人开发者则只能通过App Store进行发布。

只要获取了开发者资格,就可以面向苹果所有平台(Mac、iOS、Apple Watch、Safari)进行开发和销售。

在App Store上架销售的App,默认是面向全世界销售,也可以自己控制在哪些国家销售。销售所获得的收入,苹果将获得三成,开发者获得七成。1.5.2 在模拟器中运行程序

Xcode安装好后,就默认安装了iOS模拟器,可以方便地运行自己开发的App。值得一提的是,与一般人对模拟器的印象不同,iOS 模拟器的运行速度非常快,有时候甚至比真机还快,一点都不卡,启动速度也很快,使用起来令人感觉愉快,如图1-4所示。图1-4 iOS模拟器选择菜单

选择好运行的设备,按下快捷键command+R即可运行。1.5.3 在真机中运行程序

目前要在真机中运行调试App,必须拥有开发者证书。有些功能的开发用真机方便些,比如定位、照相、方向感知等用到硬件功能的地方。

有了开发者账号后,可以在Xcode之中按下command+,(逗号),打开设置,如图1-5所示。图1-5 Xcode设置

如图1-5所示,可以在此添加自己的开发者账号。添加成功后,将iPhone连接到计算机,Xcode 将会自动检测设备,并自动为其申请调试证书,之后会从 iPhone 中拷贝调试符号(第一次调试时才会拷贝),需要几分钟的时间,之后就可以在图 1-4 中看到自己的真机设备,此时就可以选择真机运行自己的代码了。1.5.4 调试命令与技巧

Xcode中可以方便地指定程序断点。程序中断运行后,在界面下面的调试小窗口中可以方便地查看变量值以及输入调试命令,如图1-6所示。图1-6 Xcode调试

在代码左侧空白处单击鼠标即可插入断点;左下角可以查看在断点处的环境变量值;右下角的(lldb)处可以输入调试命令。lldb是Xcode的调试器程序。常用的lldb命令有p(打印基础类型变量值)、po(打印NSObject或其子类型的值)等。1.5.5 将程序打包发布至App Store

App在编写完毕后,便可以发布到App Store上。先要登录网址http://itunesconnect.apple.com,登录后如图1-7所示。图1-7 itunesconnect界面

在“我的App”中新建一个App,将自己App的App ID填入,相关的内容填好,要注意版本号一定要和自己App实际的版本号一致。之后就可以在Xcode中直接上传了,先从菜单“Window”打开“Organizer”,如图1-8所示,Organizer中的右边界面,如图1-9所示。图1-8 Xcode的Window菜单展开图1-9 Organizer中的右边界面

如果Organizer内容为空,需要先建立Archive,如图1-10所示,打开Product菜单,同时运行设备要选择iOS Device或者真机,此时Product菜单下Archive项可以单击,将生成Archive,在Organizer中就能看到该项目了。在图1-9中,可以先Validate(验证),然后单击Submit to App Store按钮(即上传至App Store),等待一段时间,就上传成功了,当然前提是在itunesconnect里建立好了这个App的信息。图1-10 建立Archive

上传完毕后,要继续在itunesconnect中完善App的信息,包括应用的截图甚至视频、定价、联系方式等。

所有一切都准备就绪后,就可以提交审核了,审核平均需要一周的时间,而且很有可能会因为某些设计不符合苹果的规范而被拒,不过,这个过程是透明的,只要遵照了苹果的规范,一般都会通过,即使被拒绝了,也可以申诉,或者重新修改后提交,只要符合规范,都能通过。1.6 小结与作业

iOS的开发必须使用Mac OS以及Xcode。Mac OS的底层对接了UNIX系统,而深受开发者的喜爱。Xcode是苹果提供的集成开发环境,功能强大。开发iOS使用Objective C 语言或 Swift 语言,目前来看 Swift 语言还不足以替代 Objective C 语言。要重视使用Xcode的帮助文档,开发中碰到问题要知道解决的几种方式,在网上提问时要注意方式方法。将iOS程序打包到App store上架,必须要加入苹果的开发人员计划。

作业:

1.Xcode常用快捷键有哪些?请尝试使用,这些可以提高开发效率。

2.Objective C语言你都掌握了吗?如果没有,请先温习Objective C语言。

3.Xcode的帮助文档都是怎么使用的?遇到问题解决不了时,应该怎么办?

4.怎么才能把App打包到App Store上发布?在本课程结束时,尝试将自己所做的App提交到App Store上发布。第2章第一个iOS应用——“hello,world”2.1 新建项目2.1.1 新建Single View项目

打开Xcode 8,选择“新建Xcode项目”,如图2-1所示。图2-1 新建Xcode项目

如图2-2所示,选择“Singe View Application”,同时注意左上角对应的选项卡是 iOS。然后单击下一步按钮“Next”,定义项目名字与组织标识,如图2-3所示。图2-2 选择“Single View Application”图2-3 项目名字与组织标识(Organization Identifier)

项目名自己随意定义,最好用英文单词。Organization Identifier是组织标识,用来与其他 App 区分,这里笔者用的是自己域名的倒写。在 iOS 系统中,就是靠这个标识来区分各个App,因此每个App的标识不仅要唯一,还要防止可能与别人的App发生冲突。

其他的设置遵循默认就可以了,然后单击下一步按钮“Next”,接下来的窗口是要选择项目存放在哪个文件夹,选择默认即可,便进入初始开发状态了,如图2-4所示。图2-4 进入开发界面

如图2-4所示,中间的部分是项目的一部分设置,可以进行更改。(1)Version是项目的版本号,这个自己定义即可,如果提交到App Store,版本号必须至少为1.0。(2)Build必须是整数,自己定义,这个在App展开测试发布时,如果每次发布的测试版版本号都相同,那就必须通过Build来区分各次提交的App(每次提交的App都不能自己删除,所以如果版本号相同的话,就只有通过这个方法来区分),笔者的方法是每次打包新的测试版时都将Build加1。(3)Signing 是应用证书签名方面的内容,是必需的(苹果用来给应用打上开发者的数字签名,证明这个应用是某开发者做的,可以防止不明来源,以及检测开发权限等方面的内容),自Xcode 8开始,新增了这个Automatically manage signing的选项,默认是不打勾的,建议这里打勾,让 Xcode 8 接管证书管理。否则必须自己选择证书。这里的Team下拉框是开发者证书列表,在Xcode设置中登记过自己的开发者账号后,在这里会出现自己的开发者证书选项。如果没有的话,默认是none,可以进行模拟器和真机测试,但不能发布出来。证书问题是最令初学者头痛的问题,证书是密码学的内容,但限于篇幅和主题原因在本书未过多阐述,但如果缺乏这方面知识,会理解困难,有关操作时遇到问题会难以解决。关于密码学,推荐日本的结城浩著,周自恒译的《图解密码技术》,这本书通俗易懂,通读便可掌握密码学大概,证书的理解问题也可解决了。Xcode使用的开发者证书,可以登录苹果开发者网站https://developer.Apple.com中自己的开发者账号后管理,也可下载。Xcode一般会自动完成这个过程,但有时候不能正常工作,这时候必须要知道,证书存储在“钥匙串”(Mac OS自带的一个软件,在LaunchPad中可以找到)中,如果 Xcode 提示证书问题,可以到钥匙串中寻找相关的证书,删除掉再重新导入或者让Xcode再尝试,一般都可以解决问题。(4)Deployment Target是最低支持到的iOS版本。各代iOS的SDK都有区别,因此要看开发者愿意兼容到哪个版本。这里建议最低选iOS 9.0(支持当前最高2个版本)。(5)Devices是指支持何种设备,可以只支持iPhone,也可以只支持iPad,也可以两者都支持。(6)Main Interface 指定主页是用哪个 storyboard,这里将默认的 Main 改为LaunchScreen(先学会用代码构建界面,以后再学可视化方法)。(7)Device Orientation 设备旋转特性,该属性可以指定设备是否可以左转界面、右转界面或者倒转。一般可以只选择Portrait,即正面,不能旋转。(8)其他的选项待以后章节再进行讲解。2.1.2 项目结构

如图2-4左侧的文件列表,可以看到自动生成的代码。

项目根目录下有4个文件夹,开发时一般只用到第一个与项目同名的文件夹。其他3个文件夹中1个是放最终产品App,另两个是用来编写测试代码。

与项目同名的文件夹是存放开发相关文件的地方,这里已经生成了两个类,分别是AppDelegate和ViewController,前者是应用程序代理类,用来处理应用程序生命周期的各个事件响应,后者是主界面的视图控制器。

Main.storyboard 和 LaunchScreen.storyboard 分别是主界面和启动画面的可视化界面,打开即可用拖曳控件的方式方便地制作界面。

Asset.xcasset是用来存放图片的地方,可以把App的图标和启动画面根据一定的规格集中在这里指定和存放。

info.plist是一个“键值对”文件,指定该App的很多属性。

Supporting files文件夹存放有main函数,还可存放其他一些文件。2.2 AppDelegate.m添加代码2.2.1 创建UIWindow对象

首先必须确认在项目属性页面,把 Main Interface 指定为 LaunchScreen.storyboad (参见前面内容)。

找到Xcode界面左侧文件列表的AppDelegate.m文件,找到第一个方法,并在其中加入以下代码。- (BOOL)Application:(UIApplication *)Application didFinishLaunchingWith Options:(NSDictionary *)launchOptions {// Override point for customization after Application launch.self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];ViewController *con = [[ViewController alloc] init];self.window.rootViewController = con;[self.window makeKeyAndVisible];return YES;}

当然,还需要引入ViewController.h头文件。

在这里创建了一个UIWindow对象,将其大小设置为与屏幕相同,并将ViewController设置为该 Window 对象的 rootViewController,即根视图控制器,接着调用 makeKey AndVisible将该Window对象设置为Key Window并显示出来。所谓的Key Window,是可以接受键盘输入的窗口,有且只能有一个UIWindow能成为Key Window。2.2.2 创建ViewController对象

新建项目时已经创建好了ViewController类,此时只需要往其中添加代码即可。2.2.3 例行代码

我们可以看到,ViewController.m 文件中已经有了 viewDidLoad:等几个方法。viewDidLoad:方法是视图加载完毕后自动调用(由iOS来调用,不需要自己来调用)的方法,构筑界面一般都写在此方法中。类似的还有viewWillAppear:方法和viewDidAppear:方法,这些都是视图生命周期的回调方法,本书后面的章节将详细介绍。2.3 ViewController.m添加代码

ViewController 成为窗口的根视图控制器后,就由它来管理显示了。转到 View Controller.m文件,在viewDidLoad:方法中,添加以下代码。- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view, typically from a nib.self.view.backgroundColor = [UIColor redColor];UILabel *label = [UILabel new];label.text = @"hello,world!";label.textColor = [UIColor greenColor];[label sizeToFit];label.center = self.view.center;[self.view addSubview:label];}

视图控制器ViewController继承于UIViewController,通过self.view来管理其中的视图。先设置self.view的背景色为红色。2.3.1 创建UILabel对象

如上代码所示,创建一个标签:UILabel,方法为:UILabel *label = [UILabel new]; 或者UILabel *label = [[UILabel alloc] init]; 两者都可以,init 开头的初始化方法还有很多种。2.3.2 设定UILabel对象的位置

如上代码所示,这里将label显示在屏幕正中,用label.center = self.view.center;即可。有些时候指定其frame更方便些,所谓frame,即该视图的左上角的x, y坐标以及长和高,可以精确指定其位置和大小,后面的章节会详细介绍。2.3.3 显示UILabel对象

如上代码所示,建立好label后,还需要将其添加到self.view中来,调用UIView对象的addSubview方法即可。2.4 运行程序2.4.1 在模拟器上运行程序

在Xcode 左上角可以看到模拟器下拉列表,选择一个模拟器,按下Xcode左上角的黑色三角形按钮就可以运行了,或者直接用快捷键command+R,即可看到运行结果,如图2-5所示。图2-5 hello,world运行结果2.4.2 模拟器操作介绍

iOS 模拟器功能非常强大,性能也很好,通常开发项目时用模拟器更加方便快捷,只有在用到摄像、定位之类的功能时,用真机调试才更方便。

iOS模拟器的 Hardware菜单下有许多选项,可以选择一些手机上的操作,比如左右旋转、晃动、按下Home键,甚至可以模拟Touch ID和3D Touch操作。

按下command+S即可将模拟器的显示截图为png图片并保存在桌面上。

在Debug菜单下还可以模拟定位。

按下option键后用鼠标单击界面,即可模拟捏拉缩放操作。2.5 小结与作业

iOS 应用程序,分为多个页面,每个页面为一个 UIViewController 的子类。所有的页面基本共享同一个窗口(UIWindow对象),本章演示了如何建立一个最简单的iOS应用程序。

作业:

尝试不看本章代码,自己动手做一个iOS应用。第3章Cocoa Touch框架的运行机制与开发流程3.1 理解UI程序运行的机制3.1.1 程序不是顺序运行

UI程序的运行与之前学的C语言运行的机制有很大的不同,UI程序不是顺序运行的,而是绘制好界面,然后等待用户的输入(包括触摸,按下按钮,有消息推送或者来电),对输入进行响应。开发要做的事情,基本就是编写响应方法。而整个程序的框架,即Cocoa Touch已经将外围的一切都处理好。

这里有个概念叫异步执行。与之相对的是同步执行。同步执行就是一步步按部就班的执行,当前任务为未完成,则当前线程陷入阻塞状态,直到任务完成才运行下一个任务。而异步执行则灵活得多,指定一个任务运行后,不管任务有没有完成,马上就返回执行下一个任务。之前的任务完成后,框架会自动调用写好的回调函数来处理善后。3.1.2 用户操作,硬件中断与消息处理

用户操作时,硬件会产生一个中断,此时操作系统将陷入中断处理状态,此时会调用应用程序注册好的回调响应方法来响应该中断。App通过向操作系统注册回调方法,就能轻松实现某输入事件发生后自己定义的回调方法按预期被调用。整个 UI 程序开发,就是在这样一种机制下编写事件响应方法而已,也就是所谓的消息处理。3.2 iOS的消息处理机制

iOS主要通过视图控制器来接收消息处理。视图控制器UIViewController管理着视图的生命周期,事件如下:(1)视图加载完毕;(2)视图将显示;(3)视图已显示;(4)视图将消失;(5)视图已消失。

每一个事件都对应一个事件响应方法(框架已提供好),开发要做的事就是覆盖默认的响应方法。

视图本身也可以响应事件处理,但是为了代码结构清晰容易维护,一般不这样做。3.2.1 协议与代理

协议与代理是Objective C语言的概念,与其他的语言的名词差别很大。协议可以看作Java等语言中的接口,或者抽象类,即只有方法定义,却不实现方法。

代理是实现了协议的对象,可以看作Java等语言中实现了某接口或抽象类的对象。3.2.2 target与selector

事件发生后,到底由哪一个对象来处理事件?target 即用来指定事件由哪个对象来处理(target 本意是靶子,意思是发生事件的对象,会将事件和自己像子弹一样发送给这个“靶子”,由这个靶子来决定怎么处理)。问题是对象有很多方法,具体由哪个方法来处理呢?selector即指定某方法来具体执行响应事件。

一般的,UIControl的子类都有对象方法 addTarget: action: forControlEvent:来方便地为某事件指定由某对象的某方法来处理。3.2.3 消息中心NSNotification

有一些事件,不是由硬件中断产生。比如键盘收起事件,输入框文字改变事件等,这些事件一般通过Cocoa的通知中心机制来广播。

可以通过NSNotification类获得默认的通知中心,从中注册感兴趣的消息以及指定响应的对象及方法。当某对象不再需要响应某消息时,必须要从通知中心注销,注销后通知中心将不会再发送给该对象该消息。

具体介绍,请参见10.3节。3.3 iOS程序开发流程简介

Cocoa Touch框架已经搭建好外围脚手架,开发者所要做的不过是编写界面以及编写事件响应方法而已。事实上,所有的UI开发平台(包括Windows,Android)都是这样的套路。3.3.1 创建窗口和控件

苹果提供了UIViewController类,该类定义了一个页面,做好了所有的基础框架工作。开发所要做的,只需编写UIViewController的子类来实现某个界面及其事件响应方法,在其中的viewDidLoad方法中创建视图、控件,以及指定响应方法。除了UIViewController类,还有一些特殊用途的基础控制器类(均为 UIViewController 的子类),比如 UITable ViewController,UIActivityViewController等(也要通过编写子类来实现具体的事件响应)。3.3.2 视图与控件事件绑定

视图的基础类为UIView。该类没有事件绑定,但是可以定义手势对象加在其上,令其能够响应手势操作。一般的手势有捏拉缩放、轻拍、连拍、滑动、轻扫等。

控件是能够操作的视图类,比如开关控件、按钮控件等,其基类为 UIControl(该类也是UIView的子类),该类将低级的触摸事件自动识别为若干高级事件(比如按下、松开、拖动等),省去了自己判断是何种事件的处理,同时提供了一个方法 addTarget:action:forControlEvents:,可方便地为某个事件添加相应的响应方法。3.3.3 编写事件响应方法

事件响应方法一般性的都带有一个参数,即发生事件的视图或控件本身,如下代码所示。- (void)onClick:(id)sender{// ...}

这里onClick:方法的参数sender为id类型,假如这个方法只服务于某个按钮,则该方法可以改为以下方式。- (void)onClick:(UIButton *)btn{// ...}

可以方便地引用到发生事件的视图或控件本身,因此响应方法编写起来非常方便。3.4 MVC方法3.4.1 MVC概述

MVC是一个历史悠久的项目开发架构,MVC三个字母分别代表着模型、视图和控制器。控制器控制视图的显示,将模型中的数据显示到视图之上。通过这种架构,项目之间的关系比较明晰,容易维护,也容易扩展,非常流行。Cocoa即为这种架构。3.4.2 模型

模型即数据模型,通常可以是各种数据实体类。通过设计合适的数据结构,方便业务逻辑的表达。模型类只专注于如何组织数据。如果应用带有数据管理,使用了 CoreData的话,CoreData能自动生成模型类(实体类),具体可参见第12章12.3节,如果是通过json与服务器通信的话,需要自己根据json数据制作实体类。3.4.3 视图

视图即如何显示。对于显示何种内容由控制器来控制,本身只关注如何布局,以及各种显示效果。所有的视图类都继承于UIView。控件类都继承于UIControl,UIControl也是UIView的子类。3.4.4 控制器

控制器是 MVC 中最重要的一环,负责控制模型以及视图的显示。业务逻辑都体现在控制器中。所有控制器都是UIViewController的子类。3.4.5 再论MVC的意义

MVC对现代软件开发有着深远的影响。清晰的软件架构设计,有利于开发,也有利于维护。有时候需求不明晰,或者客户其实也不知道自己到底要什么样的东西,或者需求变更的情况下,通常对项目的影响非常大,甚至有很大一部分的代码需要推倒重写。而在架构设计得好的情况下,受影响的代码将能降到最低。MVC无疑是设计上的佼佼者。3.5 小结与作业

UI程序的运行,并不是一条线走到底的,而是有着多条线,各种回调函数。这也是最难理解的地方。App通过与iOS的配合,部分函数是自己调用,部分函数由iOS来调用(这就是回调函数),用户操作的各种事件,只有iOS知道,所以需要让iOS来调用自己定义的各个响应函数。iOS 大量运用了协议与代理模式,通过定义协议,来方便地传递数据,分离各种强耦合的代码。iOS程序开发的流程基本上是在做“填空题”,在框架之中编写各种事件响应方法。

MVC模式是现在最为流行的一种设计模式,将视图、控制器、模型(也即数据)分离开来,极大地便利了程序的结构,使得数据的流动和控制很清晰,也利于团队分工合作。

作业:

1.尝试向同学讲解什么是回调函数。

2.向同学讲解什么是协议。

3.向同学讲解消息中心机制,并阐述如果没有消息机制,程序应怎么编写,会有什么不利。

4.MVC的三个字母各自代表什么?它们之间的关系是怎样的?第4章iOS开发命名习惯与约定4.1 良好的编程习惯

iOS 的类库有着严格的开发命名约定。好的命名对于开发和维护有着非常大的影响。不恰当的命名不仅容易引起困惑,也容易引发错误。好的命名习惯,既是优秀程序员的要求,更是程序员应该养成的习惯。4.1.1 命名方式与一致性

一般常用的命名方式,是用英语单词的叠加。苹果采用的是驼峰表示法,变量或方法命名的第一个字母小写,而后每一个单词的首字母大写,比如textLabel, detailLabel。类和枚举的命名,要加上大写前缀,而后的每个单词都首字母大写,比如:UIView, UIScrollView, UITableView, UITableViewStyleGrouped。之所以要大写前缀,是因为Objective C 语言没有提供命名空间,因此大型项目容易发生命名冲突的情况,所以前缀冠以某大写字母,弥补了这个不足。一旦确定好命名方式,就要保持一致性。

很多大型软件公司,尤其世界性的,比如谷歌、微软等,对于代码风格是非常重视的,如果程序员不严格遵守代码风格,是进不了这样的公司的。

遇到代码风格差或者不把代码风格当回事的程序员留下的代码,会令人痛苦不堪,不仅难以阅读,意图也难以明白。因此为了方便他人,同时也为了方便自己,重视代码风格,是一个合格程序员的最基础的素养。4.1.2 换行与缩进

一般而言,一行代码不宜过长。如果太长不利于阅读和排错,则要考虑换行表示。缩进的话有很多不同的规范,有用Tab键缩进的,有用若干空格缩进的,为了普适性,一般可以将Tab键缩进设置为自动转换为4个空格。

缩进几个空格也有不同的规范。有的规定是2个空格,有的是4个,也有8个的。建议8个空格缩进的比较极端,但是好处也是显而易见的,如果if else语句嵌套层次过多的话,8空格缩进就容易让人意识到问题(if else嵌套层次过多容易出错)。一般而言4空格缩进用得最多。应该根据所在公司与项目的要求来确定几个空格缩进,并严格遵循。4.1.3 编程风格有什么用

编程风格好的代码,因其规律性,使得很容易阅读代码,同时在排错时很容易定位到错误地方。

编程风格不好或者没有风格的代码,看起来很容易使人崩溃。项目越大,代码数越多,编程风格对开发和维护人员的影响越大。因此大型公司很看中编程风格,甚至安排有专员对新员工进行代码复审。4.2 iOS的命名习惯4.2.1 骆驼表示法

如前所述,iOS 的命名习惯是骆驼表示法,也叫驼峰表示法。就像骆驼的驼峰一样,隔一段距离有一个驼峰,在命名上就是名字中每个单词的首字母大写。比如UITableView。

iOS的各个头文件中,有大量的代码可以参考,以及github上有大量的iOS开源项目的代码可供参考,基本都严格遵循了骆驼表示法,是学习的好范本。

必须要指出的是,C++代码有的是不用骆驼表示法的,其标准库风格一般是通过下划线连接各个单词,有的项目会掺杂一些 C++甚至 C 语言的代码,要注意这个代码风格的差别。4.2.2 C++式的下划线表示法

iOS的开发,经常要用到C语言或C++语言的函数,它们的命名风格,与骆驼表示法有很大的不同,比如多线程的GCD系列方法有:dispatch_asyc(),dispatch_get_main_queue()等,将各个单词以下划线连接起来,不用大写字母。这也是一派鲜明的表示风格,需要注意。4.2.3 使用汉字命名

Xcode支持使用汉字为变量名或者函数名等。但是支持有限,使用汉字命名时,Xcode的智能感知不会提示,也不会补全,但是不会报错,也能够正常运行。因为没有智能感知的帮助,会令人感到开发效率低下,如何选择,见仁见智。4.3 小结与作业

编程的风格非常重要。关于编程风格,网上有很多的资料可以查阅。历史上曾为左大括号{是独占一行还是放在上一行行末而争论过,因此而分成两种截然不同的编程风格,这个是值得注意的。编程风格没有对错,重在一致。一致的编程风格令人赏心悦目,容易理解。大型正规软件公司都非常重视编程风格。

命名方式经常困扰程序员,各种命名方式都有,常用的有骆驼表示法、下划线表示法,也可以使用汉字命名。

作业:

1.到https://www.github.com上寻找几个C语言或者C++语言或者iOS的项目,看看代码的编程风格,以及风格是否一致。尝试说出其风格特点。

2.尝试使用汉字命名。第5章iOS用户界面元素之UIView与控件5.1 UIView概述

UIView是所有视图类的根类。

视图的大小,用点来表示。iPhone 4及以下机型,屏幕宽320点;iPhone 4S及以上的机型,高480点;iPhone 5与iPhone 5S则高568点;iPhone 6与iPhone 6P的宽度和高度则更大一些。

点的概念与像素不同。最初的iPhone不是视网膜屏幕,1个像素表示的大小与之后的视网膜屏幕表示的大小差别很大,所以引入了点的概念:在非视网膜屏幕下,1 点就是 1个像素,而在视网膜屏幕下,1点可以代表4个像素。通过点的概念,可以比较精确地控制视图的大小。

苹果的设计规范,一般工具栏或导航栏等的高度为44点。44点也是人手触摸按钮时感到合适的最小高度。视图之间的间隔,如果不指定的话,一般默认值为8点。5.1.1 UIView家族

如图5-1所示,UIView是所有视图类的根类,由其衍生出来众多的子类以及控件类。值得注意的是,UIView的父类是UIResponder,凡是继承于UIResponder类的对象,都能收到用户触摸的事件以及消息。图5-1 UIView家族继承体系

图5-1集中了所有常用的视图类,本书所有的内容都将围绕该图中的类而展开。5.1.2 UIView基本属性

基本属性如下。(1)frame和bounds:用来规定视图大小和位置,详见下一节;(2)center:定义视图中心点在父视图的坐标,CGPoint类型;(3)transform:定义视图的变幻,见5.1.4节;(4)subviews:子视图集合,NSArray类型;(5)superview:父视图;(6)window:视图所属的窗口,UIWindow类型;(7)alpha:视图透明度,0到1;(8)backgroundColor:视图背景色,UIColor类型;(9)clipsToBounds:子视图超过视图边界的部分,是否剪切掉,BOOL类型;(10)hidden:是否隐藏视图,BOOL类型;(11)tintColor:这是个神奇的属性,会影响默认的一些颜色,子类运用得多,比如工具栏的颜色,UISwitch开关控件的颜色等;(12)layer:视图真正的显示层,CALayer类型,常用来定义视图的边框和圆角,后续会用到;(13)tag:视图的额外编号,整数类型,用得不多,定义了 tag,便可使用这个 tag从其父视图搜索到这个视图(viewWithTag:方法)。

以上属性是UIView最常用的属性。5.1.3 视图层次体系

视图是通过分层显示出来的,苹果官方文档中有一张图显示得很形象,如图5-2所示。图5-2 视图分层显示示意图图5-2 视图分层显示示意图(续)

每个App都至少有一个UIWindow对象(一般也只有一个),可以认为该对象代表了整个屏幕。所有的绘制、显示以及事件响应都在这个对象之上展开。

UIWindow上叠加了许多层UIView或其子类对象,一层一层地绘制,最后显示给用户。最上层的view会遮盖下层的view,可以动态地把某个view调整到最上层,也可以将最上层的某个view转移到下层,从而改变显示。

每个view在其父view中的位置以及大小,主要由3个相关的属性来定义或改变,分别为frame、bounds,以及center,其中center表示view的中心点的坐标(相对其父view)。

frame与bounds都是CGRect类型的结构体,包含2个结构体,分别是CGPoint和CGSize类型。CGPoint结构体描述左上角坐标,CGSize描述宽与高。可用CGRectMake(...)方法来构造一个CGRect结构体。

frame与bounds的差别如图5-3所示。图5-3 视图的frame与bounds

bounds属性表示的视图左上角的坐标永远都是(0,0)。而frame属性表示的视图左上角坐标,则是该视图相对于其父view的相对位置的坐标。center则是标识视图的中心点。5.1.4 视图变换

一般的视图都是一个矩形。有时候需要对此矩形进行某种变换,比如倾斜、旋转、移动等,这就需要用到视图变换。

UIView类有一个属性:transform,即定义视图变换。比如以下代码:// M_PI/4.0 即圆周率的1/4,表示45度角.CGAffineTransform xform = CGAffineTransformMakeRotation(M_PI/4.0);self.view.transform = xform; // 对self.view旋转45度

以上代码可以使得 self.view 按顺时针旋转 45 度,如图 5-4 所示。类似的还有其他CGAffineTransform开头的函数用以生成各种变换。图5-4 视图变换之旋转变换5.1.5 项目制作——使用计时器NSTimer制作简单动画

NSTimer是一个定时器类,可以定时触发某个函数执行。可以利用这个类,在某一段时间内均匀地定时触发函数来改变UIView对象的frame属性以改变其位置,从而实现动画。

按之前章节所述方法,新建一个项目(源代码见本书附带第 5 章项目代码),首先在项目设置中把使用的storyboard去掉。然后在AppDelegate.m中填充好以下代码。- (BOOL)Application:(UIApplication *)Application didFinishLaunchingWith Options: (NSDictionary *)launchOptions {// Override point for customization after Application launch.self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];ViewController *con = [[ViewController alloc] init];self.window.rootViewController = con;[self.window makeKeyAndVisible];return YES;}

该段代码用以在屏幕上显示ViewController对象的视图。然后在ViewController.m中,填充以下代码。@interface ViewController (){UIView *view;}@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];view = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 25, 25)];view.backgroundColor = [UIColor greenColor];[self.view addSubview:view];[NSTimer scheduledTimerWithTimeInterval:1/24.0 target:self selector:@selector(moveView:) userInfo:nil repeats:YES];}- (void)moveView:(NSTimer *)timer{if (view.center.x > 300) {[timer invalidate];}CGPoint p = view.center;p.x += 2;view.center = p;}

以上代码定义了一个UIView视图,在viewDidLoad方法中对其进行了初始化,定义了其 frame 和背景颜色,然后通过 NSTimer 的类方法 scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:来启动一个反复执行的定时器,间隔 1/24 秒触发一次moveView:方法(1秒至少有24帧图片,人眼才会感觉比较平滑),在其中修改view的中心点,令其x坐标一次增加2点。当x坐标超过300时,使得定时器失效。屏幕上将显示黑背景下一个绿色的小方块缓慢地往右移动,到屏幕边缘时自动停下。5.2 UI Control类

UIView有一个属性userInteractionEnabled,默认是NO,表示不接受用户触摸事件。要响应触摸事件,必须将此属性设置为 YES,这一切都没有 UIControl 类来得简便。UIControl 类默认可以接受触摸事件,并且对接受的触摸事件做了很详细的区分,可以很方便地定制需要响应的事件。UIControl *c = [UIControl new];[c addTarget:self action:@selector(...) forControlEvents:UIControlEvent...];

如以上代码,定义了一个UIControl对象,便可以用addTarget:方法为其简便地定制某事件的响应方法。其余使用方法均与UIView相同。

UIControl 类是所有控件类的父类。所谓控件,就是能够接受用户的触摸操作,并对其做出响应的UI组件。常用有按钮、开关、分段控件、进度条、等待指示符控件等。5.3 标签视图类UILabel5.3.1 UILabel概述

UILabel 类是用得最多、最频繁的一个视图类,用来在屏幕上显示一小段文字。其使用非常简单,以下代码摘自一个真实的项目。_detailLabel = [UILabel new];_detailLabel.frame = CGRectMake(size.width - 200 - right, 0, 200, size.height);_detailLabel.textAlignment = NSTextAlignmentRight;_detailLabel.font = [UIFont fontWithName:_detailLabel.font.fontName size:15.0];_detailLabel.text = @"显示文字";

这里集中体现了几个 UILabel 常用的属性,textAlignment 用以指定对齐方式,font指定字体,text指定显示的文字,另外还有textColor指定文字的颜色,等等。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载