Xcode项目包含了大量的信息,这些信息描述了构成项目的文件以及在构建应用时该如何使用这些文件,比如:
·待编译的源文件(代码)。
·.storyboard或.xib文件,它们会以图形化方式表示界面对象,在应用运行时进行实例化。
·资源,如图标、图片或声音文件,它们是应用的组成部分。
·在构建应用时需要遵循的所有设置(编译器、链接器的指令等)。
·代码运行时所需的框架。
图6-1:项目窗口
Xcode项目窗口会展现出所有这些信息,还可以使用、编辑,并在代码间导航;此外,它还能够呈现出构建或调试应用的进度与结果。该窗口显示出了大量信息与功能!项目窗口非常强大和复杂;学习如何使用需要花些时间。下面就来探索这个窗口,看看其构造方式。
项目窗口有4个主要的构成(如图6-1所示):
1.左边是导航窗格。你可以通过View→Navigators→Show/Hide Navigator(Command-0)或单击工具栏中最右侧的第1个View按钮来显示或隐藏。
2.中间是编辑窗格(简称为“编辑器”)。这是项目窗口的主要区域。项目窗口几乎总会显示一个编辑窗格,并且还可以同时显示多个编辑窗格。
3.右边是辅助窗格。你可以通过View→Utilities→Show/Hide Utilities(Command-Option-0)或单击工具栏最右侧的第3个View按钮来显示或隐藏。
4.底部是调试窗格。你可以通过View→Debug Area→Show/Hide Debug Area(Shift-Command-Y)或单击工具栏最右侧的第2个View按钮来显示或隐藏。
所有的Xcode键盘快捷键都可以定制;参见Preferences窗口的Key Binding窗格。我这里所用的键盘快捷键都是默认值。
6.2.1 导航窗格
导航窗格就是项目窗口左侧的信息列。你主要通过它来控制项目窗口的主要区域会显示什么(编辑器)。对于Xcode来说,一个重要的使用模式就是:在导航窗格中选中某个东西,它就会显示在编辑器中。
你可以切换导航窗格的可见性(View→Navigators→Hide/Show Navigator或Command-0);比如,如果通过导航窗格找到了所需的条目,那么你可能想暂时隐藏导航窗格来增加屏幕的尺寸(特别是在小显示器上)。你可以通过拖曳右边的竖线来改变导航窗格的宽度。
导航窗格本身可以显示8种不同的信息;这样实际上会有8种导航器。这是通过上方的8个图标来表示的;要想在导航器间切换,请使用这8个图标或相应的键盘快捷键(Command-1、Command-2等)。如果导航窗格被隐藏了,那么请按下导航器的键盘快捷键,这会显示出导航窗格并切换到相应的导航器上。
根据你在Xcode首选项Behaviors窗格中设置的不同,在执行某个动作时,导航器可能会自动显示出来。比如,默认情况下,在构建项目时,如果出现了警告或错误消息,那么Issue导航器就会出现。这种自动的行为并不会让人生厌,因为通常这就是你需要的行为,如果不是,那么你可以修改它;此外你还可以随时切换到其他的导航器上。
首先来体验一下各种导航器吧:
图6-2:项目导航器
项目导航器(Command-1)
单击项目导航器中的条目可以在构成项目的文件间导航。比如,在Empty Window目录中(在项目导航器中,这些类似于目录的东西实际上叫作分组),单击AppDelegate.swift文件可以在编辑器中查看其代码(如图6-2所示)。
在项目导航器顶层有个蓝色的Xcode图标,它代表Empty Window项目自身;单击它可以查看与项目及其目标相关的各种设置。在不了解的情况下请不要修改任何设置!稍后我将介绍这些设置。
可以通过项目导航器底部的过滤栏限制显示的文件;如果文件有很多,那么通过它可以快速找到已知名字的文件。比如,可以在过滤栏搜索框中输入“delegate”。试验完后请不要忘记删除过滤信息。
如果对导航器进行了过滤,那么它会一直进行过滤,除非将其删除,否则连关闭项目也不行!常见的一个错误是对导航器进行了过滤,但却忘记了,这样就看不到结果了(因为你一直在盯着导航器本身,没看到下面的过滤栏),你还纳闷:“我的文件去哪儿了?”
符号导航器(Command-2)
符号就是个名字,通常是类或方法的名字。它有助于代码导航。比如,你可以选择过滤器栏中的前两个图标(前两个是蓝色的,后一个是深色的),然后快速查看AppDelegate的applicationDidBecomeActive:方法定义。
你可以通过各种方式选择过滤器栏的图标以查看符号导航器内容的变化。在过滤栏的搜索框中输入一些字符以限制符号导航器中的内容;比如,你可以尝试在搜索框中输入“active”,然后看看发生了什么变化。
图6-3:搜索导航器
如果第2个过滤器图标没有高亮,那就会显示出所有符号,包括Swift与Cocoa所定义的内容(如图4-1所示)。这是查看对象类型的一种绝佳方式,同时还可以快速进入声明这些类型的头文件中(一种重要的文档形式,参见第8章)。
搜索导航器(Command-3)
该强大的搜索功能用于寻找项目中的文本。你还可以通过Find→Find in Project(Command-Shift-F)调出搜索导航器。搜索框上的单词会展示出现在所用的选项;他们是弹出菜单,可以通过单击其中一个来改变选项。试着搜索“delegate”(如图6-3所示)。单击任何一条搜索结果就会跳转到代码中该文本出现的位置。
在搜索框的左下方是当前的搜索区域。可以单击它来查看搜索域面板。你可以限制只对项目中的某个分组(目录)进行搜索,还可以定义新的域:单击New Scope会弹出域配置窗口,你可以从中查看选项。域是针对每个用户而不是项目定义的;这里所创建的域也会出现在其他项目中。
可以在其他搜索域(位于底部的过滤栏)中输入内容来进一步限制显示的搜索结果(现在我不打算再介绍过滤栏了,不过每个导航器都有某种形式的过滤栏)。
问题导航器(Command-4)
问题导航器主要在代码中出现问题时使用。它指的并不是项目中有问题;而是Xcode的一个术语,指的是项目构建时所出现的警告与错误消息。
要想查看问题导航器,你需要给代码制造点问题才行。转到(你应该知道如何做了,至少有3种方式)文件AppDelegate.swift,在文件顶部最后一行注释后面的空行下及import行之上输入howdy。构建项目(Command-B)。这时问题导航器会显示出一些错误消息,表示编译器无法处理这种出现在不合法位置处的不合法的单词。单击其中一个问题可以在文件中查看它。在代码中,问题“气球”会出现在有问题这一行的右侧;如果觉得有干扰,你可以通过Editor→Issues→Hide/Show All Issues(Command-Control-M)改变其可见性。
既然你已经让Xcode报错了,那么请选择“howdy”并将其删除;保存并再次构建,这时问题会消失不见。真希望实际开发中也能这么简单!
测试导航器(Command-5)
该导航器会列出测试文件以及每个测试方法,同时还可以运行测试并查看测试是通过还是失败了。测试代码并不属于应用的一部分;它会调用应用代码以检测其行为是否与期望一致。第9章将会对测试进行更多的介绍。
调试导航器(Command-6)
在默认情况下,该导航器只在调试暂停时才会出现。对于Xcode来说,运行与调试之间的差别并不明显;环境都是一样的。差别只不过在于是否使用了断点(第9章将会详细介绍关于调试的相关信息)。
要想查看调试导航器,你需要为代码设定断点。再一次转到文件AppDelegate.swift,选中return true这一行,并选择Debug→Breakpoints→Add Breakpoint at Current Line,这时蓝色的断点箭头就会出现在该行。运行项目。在默认情况下,当遇到断点时,导航窗格会切换到调试导航器,调试窗格会出现在窗口下方。调试项目时,你很快就会熟悉这一总体布局(如图6-4所示)。
图6-4:调试布局
调试导航器以几个数字与图形化的分析信息展示开始(至少会有CPU、内存、磁盘与网络);单击其中一个可以在编辑器中看到更多的图形化信息。在应用运行时,可以通过这些信息追踪应用可能的错误行为,从而避免了运行Instruments辅助工具(第9章将会介绍)的复杂性。要想切换调试导航器顶部分析信息的可见性,请单击“gauge”图标(位于进程名右侧)。
调试导航器还会显示出调用堆栈,其中会显示出暂停位置处的嵌套方法名;如你所想,你可以通过单击方法名来导航。你可以通过导航器底部过滤栏中的第1个按钮来缩短或增加列表。可以通过进程名右侧的第2个图标在根据线程显示与根据队列显示之间进行切换。
调试窗格包含了两个子窗格,你可以根据需要显示或隐藏它们(View→Hide/Show Debug Area或Command-Shift-Y):
变量列表(位于左侧)
里面是调用堆栈中所选方法作用域中的变量。
控制台(位于右侧)
调试器会将文本消息显示在这里;你可以通过这里查看到运行的应用所抛出的异常,同时还可以让代码有意发送描述应用进程与行为的日志消息。这些消息非常重要,因此在应用运行时请密切关注控制台。还可以使用控制台向调试器输入命令。在暂停时,这通常是比变量列表更好的查看变量值的方式。
可以通过窗格右下角的两个按钮来隐藏变量列表和控制台。还可以通过View→Debug Area→Activate Console来显示出控制台。
可以通过视图调试查看应用的视图层次结构。要想切换到视图调试,请选择Debug→View Debugging→Capture View Hierarchy(或单击调试窗格顶部栏中的调试视图层次按钮)。
断点导航器(Command-7)
该导航器会列出所有断点。目前只有一个断点导航器,但在调试有很多断点的大型项目时,你会觉得该导航器很有用。此外,你可以在这里创建特殊断点(如符号断点),通常这是管理现有断点的中心位置。我们会在第9章对其进行详细介绍。
报告导航器(Command-8)
该导航器会列出最近的主要动作,如项目的构建或运行(调试)。在执行某个动作时,单击清单就可以查看(在编辑器中)到所生成的报告。报告可能包含其他途径无法显示的信息,此外,你还可以通过它回想起最近的一些消息(比如,“刚才调试时出现了哪个异常”)。
举个例子,通过单击成功构建的清单,然后通过报告上方的过滤器开关来选择显示所有消息,那么我们可以看到构建的每一个步骤(如图6-5所示)。要想显示某一步的所有文本,请单击该步骤,然后单击最右边的Expand Transcript按钮(参见Editor菜单中的菜单项)。
图6-5:查看报告
在通过单击导航窗格进行导航时,不同的单击方式会影响导航的结果。在默认情况下,按住Option并单击会在辅助窗格中导航(稍后将会介绍)、双击会打开新窗口,按住Option与Shift并单击会弹出一个小的智能窗格,你可以指定导航到哪里(新窗口、新页签,或新的辅助窗格)。要想了解管理这些单击的设置,请访问Xcode首选项的导航窗格。
6.2.2 辅助窗格
辅助窗格是位于项目窗口右边的那一列。它包含了查看器,这些查看器提供了关于当前所选以及设置的信息;如果设置可以修改,那么可以在这里进行修改。它还包含了编辑项目时所需的一些库(所需的对象来源)的信息。在编辑.storyboard或.xib文件(第7章将会介绍)时会凸显其重要性。不过,它对于代码编辑来说也很有用,因为快速帮助(文档的一种形式,第8章将会介绍)也会显示在这里;辅助窗格还是代码片段的来源(参见第9章)。要想显示或隐藏辅助窗格,请选择View→Utilities→Hide/Show Utilities(Command-Option-0)。你可以通过拖曳其左边的竖线来改变辅助窗格的宽度。
辅助窗格包含了大量控制板,它们会形成多个集合并被划分到两个主要的分组中:窗格的上半部分与下半部分。你可以通过拖曳它们之间的水平线来改变二者的相对高度。
上半部分
辅助窗格上半部分会有哪些内容取决于当前编辑器所选内容。主要情况有如下4种:
正在编辑代码文件
辅助窗格的上半部分要么显示文件查看器,要么显示快速帮助。你可以通过辅助窗格上半部分顶部的图标或键盘快捷键(Command-Option-1、Command-Option-2)来切换它们。文件查看器很少会用到,但快速帮助则可作为文档来用(参见第8章)。文件查看器包含了多个部分,每个部分都可以通过单击头部来展开或收起。
正在编辑.storyboard或.xib文件
除了文件查看器和快速帮助,辅助窗格的上半部分还可以显示身份查看器(Command-Option-3)、属性查看器(Command-Option-4)、尺寸查看器(Command-Option-5)和连接查看器(Command-Option-6)。它们包含了多个部分,每一部分都可以通过单击头部来展开或收起。
正在编辑资源文件
除了文件查看器和快速帮助,属性查看器还会列出关于所选资源集或资源的更多信息。你可以通过它确定列出所选资源集的哪些变体,并设置资源标签;如果所选资源是图片,那么你可以配置关于它的一些额外信息。
正在调试视图层次
除了文件查看器和快速帮助,对象查看器可以显示关于当前所选视图的信息,尺寸查看器可以显示当前所选视图的大小、位置与约束。
下半部分
辅助窗格的下半部分会显示四种库之一。你可以通过单击顶部的图标或键盘快捷键来切换显示的库。这些库分别是文件模板库(Command-Option-Control-1)、代码片段库(Command-Option-Control-2)、对象库(Command-Option-Control-3)以及媒体库(Command-Option-Control-4)。对象库是其中最为重要的;在编辑.storyboard或.xib文件时会经常使用到它。
要想查看关于库中当前所选条目的描述信息,请按空格键。
6.2.3 编辑器
项目窗口中间是编辑器。你在这里完成实际的工作,阅读并编写代码(参见第9章),在.storyboard或.xib文件中设计界面(参见第7章)。编辑器是项目窗口的核心。你可以关闭导航窗格、辅助窗格和调试窗格,但如果项目窗口中没有编辑器就完全不行了(虽然你可以通过调试窗格来使用编辑器)。
编辑器提供了自己的导航形式,即顶部的跳转栏。它不仅会以分层方式显示出当前正在编辑的文件,你还可以通过它切换到不同的文件。特别地,跳转栏中的每个路径组成也是个弹出菜单。这些弹出菜单可通过单击每个路径组成来调出,或使用键盘快捷键(在View→Standard Editor子菜单中的第2部分)。比如,Control-4会弹出分层的弹出菜单,你完全可以通过键盘在菜单中导航,这样就可以选择项目中的不同文件来编辑了。此外,跳转栏中的每个弹出菜单也是个搜索框;你可以从跳转栏中弹出菜单并输入内容。通过这种方式,即便项目导航器没有显示出来,你也可以导航项目。
跳转栏最左侧的符号(Control-1)会弹出一个层次化菜单(相关条目菜单),可以导航到与当前文件相同的文件上。这里出现的内容不仅取决于当前正在编辑的文件,还与该文件当前所选内容相关。这是个非常强大且便捷的菜单,你应该花些时间好好研究它。你可以导航到相关类文件和头文件(父类、子类与兄弟类;兄弟类指的是拥有共同父类的类);你可以查看被当前所选方法调用的方法,并调用当前所选的方法。在Xcode 7中,选择Generated Interface可以查看到Swift文件的公开API以及Swift可以看到的Objective-C头文件。
编辑器会记住所显示的历史信息,你可以通过跳转栏中的后退按钮回到之前查看的内容,这也是个弹出菜单,可以从中进行选择。此外,还可以选择Navigate→Go Back(Command-Control-Left)。
在开发项目时,你很有可能想要同时编辑多个文件,或获得同一个文件的多个视图以便能够同时编辑文件的两个区域。这可以通过3种方式实现:辅助窗格、页签与第二窗口。
辅助窗格
你可以通过辅助窗格将一个编辑器分割为多个编辑器。要想做到这一点,请单击工具栏中的第2个编辑器按钮(“显示辅助编辑器”),或选择View→Assistant Editor→Show Assistant Editor(Command-Option-Return)。此外在默认情况下,在导航时按住Option键会打开一个辅助窗格;比如,按住Option键并单击导航窗格或按住Option键并选择跳转栏,这会打开一个辅助窗格(如果已经有辅助窗格,那么就会导航到现有的辅助窗格)。要想移除辅助窗格,请单击工具栏中的第1个编辑器按钮,或选择View→Standard Editor→Show Standard Editor(Command-Return),还可以单击辅助窗格右上角的X按钮。
你可以确定辅助窗格的布局。要想做到这一点,请选择View→Assistant Layout子菜单。一般情况下,我更喜欢All Editors Stacked Vertically,但这仅仅是个人习惯而已。一旦打开了辅助窗格,你就可以进一步将其分割为更多的辅助窗格。要想做到这一点,请单击辅助窗格右上方的“+”按钮。要想隐藏辅助窗格,请单击右上方的X按钮。
辅助窗格之所以是辅助窗格,而不仅仅是一种分割窗格编辑器,原因在于它与主编辑器窗格之间可以保持着特殊的关系。默认情况下,主编辑器窗格的内容是由你在导航窗格中所单击的条目来决定的;同时,辅助窗格可以响应主编辑器窗格中正在编辑的文件,它会智能地改变正在编辑(辅助窗格)的文件,这叫作追踪。要想配置辅助窗格的追踪行为,请使用跳转栏中的第1个组件(Control-4)。这是个追踪菜单;它类似于刚才介绍的相关条目菜单,不过选择某个类别会决定自动化的追踪行为。如果某个类别有多个文件,那么一对箭头按钮就会出现在跳转栏的最右侧,你可以通过它们进行导航(或使用第2个跳转栏组件,Control-5)。可以通过将辅助窗格的第1个跳转栏组件设为Manual来关闭追踪。
如果想要关闭辅助窗格,但又想继续编辑内容,请先将辅助窗格的内容移动到主编辑器窗格中(Navigate→Open In Primary Editor)。
页签
你可以将整个项目窗口界面表示为一个页签。要想做到这一点,请选择File→New→Tab(Command-T),如果之前并未显示出页签栏,那么这会将其显示出来(就在工具栏下面)。页签界面的使用就像Safari等应用一样。你可以通过单击页签或使用Command-Shift-}来切换页签。一开始,新的页签看起来与建立页签的原始窗口别无二致。不过现在你可以在页签上做一些修改,即改变显示的窗格或编辑的文件,同时又不会影响其他页签。这样就可以得到项目的多个视图。你可以为每个页签添加一个描述性的名字:双击页签名就可以进行编辑。
第二窗口
第二项目窗口类似于页签,但它是个独立的窗口,而页签则位于相同的窗口中。要想创建第二窗口,请选择File→New→Window(Command-Shift-T)。此外,你还可以将页签拖曳出当前的窗口而使之成为一个窗口。
页签与第二窗口之间的差别并不明显;无论使用哪一个,无论出于何种目的其实都是习惯和方便的问题。我发现第二窗口的优势在于你可以同时将其看作主窗口,这个窗口会小一些。这样,如果有文件频繁被引用,那么我会使用第二窗口作为编辑器来显示该文件,它不会占据太多屏幕空间,也不需要额外的窗格。
页签与窗口都拥有自定义行为。比如,如前所述,调试时能够查看控制台是非常重要的;我喜欢在满屏项目窗口中查看,不过还希望可以切换回来查看代码。因此,我创建了一个自定义行为(单击Preferences窗口Behaviors窗格底部的+按钮),它会执行两个动作:在活动窗口中显示出名为Console的页签,并显示出Console View调试器。此外,我还为该行为指定了一个键盘快捷键。这样,任何时候就都可以通过键盘快捷键切换至Console页签了(如果不存在则创建),这只会显示出控制台。它就是一个页签,因此可以通过Command-Shift-}在它与代码间切换。
有多种方式可以改变编辑器中的内容,导航器并不会自动与这些变更进行同步。要想从项目导航器中选择在当前编辑器中显示的文件,请选择Navigate→Reveal in Project Navigator。