本节书摘来自华章计算机《Swift iOS应用开发实战》一书中的第1章,第1.1节,作者:刘铭 著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1.3 了解Xcode
作为一名开发者,不管在什么平台上进行开发,总需要一大堆的软件支持,才能将自己的想法变成可以让成千上万人受益的应用程序。苹果不希望这样,它为开发者提供了一个优雅的、功能强大的、光鲜亮丽的开发工具包,这个包就叫做Xcode。通过Xcode,我们可以创建、测试、部署和发布iOS或OS X应用程序。在2014年6月,苹果发布了iOS 8和Xcode 6的beta版本,在使用的过程中笔者能够感受到苹果力求让开发工具无比简单、实用。通过其强大的功能和全新技术,帮助开发者在创建应用程序的过程中体会到无限的乐趣和前景。
接下来使用Xcode创建一个简单的、具有交互功能的iOS应用“HelloWorld”。通过前面的学习我们知道Playground无法实现交互功能,所以下面我们要创建一个真正的iOS项目。
1.3.1 使用Xcode创建iOS项目
如果你之前在其他的平台上开发过应用程序,可能会有一个疑问:在iOS和OS X开发领域中,为什么Xcode会成为一枝独秀?最主要的原因可能就是简单。化繁至简是苹果始终遵循的原则,而简单的背后却体现了其强大的内涵。Xcode提供了在开发中你需要的所有东西:一个直观的代码编辑器、高级的调试器,集成界面编辑功能以及苹果不断更新和维护,这些使得它变成了真正的独一无二。
步骤1 点击欢迎画面中的“Create a new Xcode project”或者选择菜单“File→ New→Project”。此时会出现项目模板选择面板,在面板的左侧选择开发项目的目标平台。利用Xcode不仅可以开发iOS项目,还可以开发OS X应用程序。
步骤2 在确定iOS中的Application类别后,在右侧的主面板中会列出几种基本的项目模板。选择“Single View Application”模板,如图1-10所示。该模板只提供一个用于显示的视图和一个管理这个视图的控制器,而且视图一般会存储在故事板或nib文件中。除此以外,该模板还包含了一个应用程序委托类型(UIApplicationDelegate)的对象,它用于响应一些系统事件,比如应用程序的启动、进入到后台和程序终止退出等。
在这里我们对Application中所列出的项目模板进行简单介绍。
Master-Detail Application:创建一个基于列表的应用程序。当我们从主列表中选择一个条目后,就会在另一个视图中显示相应的详细内容。此模板还会提供一个返回按钮让用户可以从详细视图返回到主列表。在苹果内置的邮件应用和很多的新闻类应用中我们可以看到该技术,当用户点击列表中的某条新闻后,就可以看到详细的新闻内容。当该模板用在iPad项目中的时候,会形成分离的视图效果。
Page-based Application:使用页面视图控制器(page view controller)创建的项目模板,用户可以在屏幕上进行翻页。
Single View Application:创建一个基本的应用程序模板,它包含一个单独的视图和相应的视图控制器。
Tabbed Application:创建一个有标签栏的应用程序。在一般情况下,标签栏会包含几个不同的类别并出现在屏幕的下方。当用户进行选择时,就会显示不同的视图。iPhone中的电话应用程序就使用了该技术,使用它的用户可以在个人收藏、最近通话、通讯录、拨号键盘和语音留言之间切换。
Game:如果你想开发一款游戏项目,就可以使用该模板。在之后的配置选项中,还可以选择使用SceneKit、SpriteKit、OpenGL ES或Metal技术。
步骤3 点击“Next”按钮后,需要指定以下几个配置选项。
Product Name:应用程序的名称。例如,我们想创建一个交互应用,就可以指定Product Name为“HelloWorld”。按照“潜规则”,在定义Product Name的时候,可以忽略单词间的空格,而每个单词的首字母要大写(不是必需的)。Product Name在项目开发的过程中是可以修改的,但同时它也是一个非常重要的细节,所以名字和功能要尽量保持一致。
Organization Name:不管你是一个独立开发者还是软件公司的某个开发部门,你需要指定一个组织机构或单位的名称。这里,我们可以随意起一个名字。但是如果你想要将应用程序提交到App Store,就需要填写正确的信息内容,虽然不是必需,但是笔者强烈推荐填写。此外,每当我们在项目中新建一个文件,组织名称都会出现在文件顶部的版权详细信息中。
Organization Identifier:组织标识,如果我们计划将应用程序发布到App Store,这个设置非常重要。例如,将应用程序发布到App Store,就需要指定一个App ID和Bundle Identifier。其中Bundle Identifier就依赖于这个Organization Identifier。Organization Identifier的格式为一个反向域名,这里我们将其设置为cn.project。
Bundle Identifier:我们不能编辑此选项,它完全依赖于Organization Identifier和Product Name。
Language:这是在Xcode 6中的一个新选择,因为苹果推出了一个全新的编程语言Swift,所以在项目中我们可以选择使用Objective-C还是Swift。在HelloWorld项目中设置为Swift。
Devices:选择iPhone,代表应用程序项目是专门为iPhone(包含iPod Touch)设备开发的。如果选择Universal,则代表该项目可以同时支持iPhone和iPad设备。
Use Core Data:该复选框指定项目是否支持Core Data。如果勾选Core Data,则可以在项目中使用数据库特性。
设置完成的配置选项面板如图1-11所示,确认无误后点击“Next”按钮。
步骤4 接下来会询问保存项目的本地位置,可以将它保存到任意的位置上。
步骤5 注意到在项目保存面板中的底部有一个“Create git repository on”选项,当我们希望创建一个本地仓库的时候可以勾选此项,在默认情况下它是未勾选的。如果我们是以团队形式进行多人项目开发,推荐勾选此项。
步骤6 最后点击“Create”按钮创建HelloWorld项目。
在创建好项目以后,就会看到Xcode的工作界面。在界面的最上方是工具栏,其下方分别包含导航区域、编辑区域、调试区域和实用工具区域四部分,如图1-12所示。其实Xcode工作界面的每个区域还有更细致的划分。接下来,我们将会针对每个区域进行详细介绍。
1.3.2 Xcode的工具栏
相比于Xcode 5,Xcode 6的工具栏布局发生了较大的变化。最左侧变成了操作窗口的三个按钮,接着是运行和终止按钮。接下来是产品配置方案(Schemes),其中包含了构建配置选择器,后面是一个信息窗,最右侧是Editor和View选项。虽然Xcode 6整个工具栏所呈现的按钮数量远远少于其他的IDE开发工具,但是这并不会让开发者在使用时感觉不方便。苹果化繁至简的理念贯穿于其所有的软硬件产品之中,花费的心思可见一斑。
1.3.3 导航区域
Xcode的导航区域位于工作界面的左侧,整个区域共包含8种不同的导航模式,如图1-13所示。除了可以点击相应按钮切换不同导航模式以外,还可以通过Command+1至Command+8快捷键或在菜单中选择“View→Navigators”进行切换。
所有的导航器都具有过滤和范围限定功能,该功能大多位于导航区域的底部(只有搜索导航位于顶部,导航切换按钮的下面)。我们可以通过Command+Option+J快捷键访问它。在按下该快捷键以后,编辑光标就会出现在过滤框之中,而且该快捷键适用于所有8种导航方式。
- 项目导航器
项目导航器(Project Navigator)会显示项目的所有内容,通过树形结构,将一些相关的文件组织到类似于文件夹的组之中。从名称就可以猜到,项目导航可以帮助我们快速定位源代码文件、框架文件和项目目标,如图1-14所示。
若要在项目中创建一个新组(Group),我们可以在项目导航中点击鼠标右键选择一个现存的节点,然后在快捷菜单中选择“New Group”。也可以通过拖曳方式将文件移出或移入某个组,但需要说明的是,在项目导航中移动文件并不会改变本地磁盘中文件的物理存储位置。
要想删除一个文件,我们只要在该文件上按Delete键即可。此时,Xcode会询问要删除本地磁盘中的物理文件,还是只删除在项目导航中对文件的引用。删除组的操作与文件相同,只不过删除一个组时,会删除组中的所有文件。
虽然我们可以在项目导航中随意创建任意数量的组,但是有三个组是在应用程序创建的时候就已经存在的。第一个是项目组,它与我们创建的项目名称相同,其中包含了所有的代码文件和资源。第二个是测试(Tests)组,其中包含了项目的测试代码。第三个是产品(Products)组,其中包含了真正的iOS应用程序。
在项目导航器的最下方有一组图标,通过这组图标我们可以过滤显示在项目导航中的内容,如图1-15所示。其中,通过第一个增加新文件的按钮,我们不仅可以为项目创建一个新的文件,还可以将项目位置以外的文件添加到当前项目中。
- 符号导航器
通过Command+2快捷键可以跳转到符号导航器(Symbol Navigator)。符号导航器可以帮助我们快捷地定位项目中的某个类、方法或属性。因为从Xcode 4.5以后,LLVM编译器使用了Clang作为前端,所以在符号导航中浏览类、方法和属性的速度要快很多。
- 搜索导航器
除了可以使用Command+3快捷键切换到搜索导航器(Search Navigator)以外,我们还可以使用Command+Shift+F快捷键快速进入搜索功能。使用搜索导航器可以帮助我们在指定的范围内搜索指定的内容,搜索结果将会显示在其下方的区域中,如图1-16所示。
点击搜索框上方的Find字段,之后可以在Find和Replace之间切换。以Find模式为例,其中包含了四种不同的搜索范围:Text(项目中的所有文本)、References(项目中所有的引用)、Definitions(项目中所有自定义的,不包含从外部引用的)、Regular Expression(正则表达式)。除第四项以外,它们又都包含四种不同的搜索方式:Containing(包含)、Matching(匹配)、Starting with(从开头搜索)、Ending with(从结尾搜索),如图1-17所示。
另外,在搜索框的下方左右两侧各有一个字段可以进行切换。当点击“In Project”以后,导航部分会被切换到范围选择界面,我们可以在这里确定在项目中搜索或替换的范围。当点击右侧的“Ignoring Case”后,可以在忽略大小写和匹配大小写之间进行切换。
- 问题导航器
当我们构建项目的时候,编译器所产生的警告、错误消息和分析警告会显示在问题导航器(Issue Navigator)之中。在列表中选择某个警告或错误后,代码编辑器就会快速定位对应文件中有问题的那行代码。 - 测试导航器
使用Comm and+5快捷键可以切换到测试导航器(Test Navigator)。单元测试对软件开发平台来说是非常重要的一个方面。毕竟,单元测试可以帮助我们修复程序中的Bug以及找到运行时意外崩溃的原因。如果提交到App Store中的应用程序在运行时总是出现崩溃的情况,那么苹果在审核时会毫不犹豫地将之拒绝。 - 调试导航器
使用Command+6快捷键可以切换到调试导航器(Debug Navigator)。它除了可以监控CPU和内存的使用情况以外,还可以监控磁盘的读写情况和应用程序在网络方面的接收发送情况。更重要的是,我们可以通过它来监控应用程序每个线程的队列执行情况。使用调试导航器可以帮助我们了解线程中对象、函数的前后调用关系。 - 断点导航器
第7个导航器是断点导航器(Breakpoint Navigator),我们可以通过它管理在项目中所设置的断点。在点击导航器中的断点以后,编辑器会快速定位到该位置。同时也可以在这里禁止或删除某个断点。
值得注意的是,我们可以在断点导航器中共享断点用于其他的项目。在列表中选择某个断点后点击鼠标右键,选择“Share Breakpoints”即可。
- 日志导航器
当我们在日志导航器(Log Navigator)中选择一个构建条目的时候,它的结果会显示在编辑区域之中。如果双击其中的警告和错误,还可以直接在代码编辑器中将其打开。当我们点击日志最后面的命令行图标时,还可以看到更详细的信息日志,帮助我们查找问题和错误,如图1-18所示。
1.3.4 编辑区域
编辑区域的功能相信大家都很清楚,它用于编辑项目中各种类型的文件。Xcode 6提供了3种不同类型的编辑模式。我们可以通过工具栏中的Editor选择器进行切换,如图1-19所示。除了标准编辑器(Standard editor)以外,另外两个分别是助手编辑器(Assistant editor)和版本编辑器(Versions editor)。
在选择助手编辑器以后,编辑区域会被分割为左右两个编辑窗口。我们经常会使用助手编辑器从Interface Builder(搭设用户界面的工具)增加IBAction或IBOutlet声明到代码文件之中并建立相应的关联。
Xcode的版本编辑器可以帮助我们轻松对比两个不同版本的源代码。如果项目使用的是Git或SVN,我们就可以通过编辑器对比当前正在编辑的文件和仓库中保存的之前版本代码的不同。
1.3.5 实用工具区域
实用工具区域位于整个工作界面的右侧,它分为上下两个部分。上面的部分是检视窗,下面则叫做库,如图1-20所示。
检视窗可以帮助我们对编辑器里选中的对象进行属性、行为等方面的设置,如控件的大小、位置、背景色、字体的样式和字号的大小等。
在实用工具区域的下半部中又分为文件模板库、代码片段库、对象库和媒体库四个部分,我们可以使用Control+ Option+Command+(1~4)快捷键进行切换。
- 文件模板库
文件模板库(File Templates Library)提供了在我们在开发中经常会用到的一些文件模板。若要使用它们,直接用鼠标将其拖曳到项目导航中相应的位置即可。
我们可以更改模板库的显示方式为图标方式或图标加文字说明的方式,如图1-21所示,只要点击其左下角的图标即可。
在选择某个文件模板以后,会在当前选择条目的左侧显示一个信息窗口,其中包含了该文件模板的功能描述,我们可以通过它来获取文件模板的相关信息。
- 代码片段库
代码片段库(Code Snippets Library)中包含了一段段可以在应用程序中复用的代码,当我们需要使用它的时候,直接用鼠标将其拖曳到文件中相应的位置即可。
另外,我们还可以创建自己的可复用的代码片段,并将其添加到代码片段库之中。在代码编辑器中选择一段代码,然后将其拖曳到代码库之中,最后在自动打开的片段编辑器中编辑必要的信息即可,如图1-22所示。如果想删除自定义的代码片段,选中相应条目按Delete键即可。
如果我们增加了新的代码片段或编辑了已有的代码片段。这些片段图标会被打上一个User标记,用以区分用户自定义的和系统自带的代码片段。
- 对象库
对象库(Object Library)中包含了各种供Interface Builder使用的可视化对象,如图1-23所示。
- 媒体库
媒体库(Media Library)包含了项目资源文件夹中的图像和图标等媒体资源,通过其下方的搜索栏,我们可以快速定位那些指定的媒体资源。