开发应用的效果:
从图中可以看到,你创建的应用界面上有三个主要的元素:
- 一个文本框(用户把文字输入到这里)
- 一个标签(这里可以用来显示信息)
- 一个按钮(它能够让应用在标签处显示信息)
当你完成开发并运行应用时,点按文本框就会呼出系统提供的键盘。使用键盘输入你的名字,关掉键盘(点按 Done 键),再点按 Hello 按钮就会看到“Hello, 你的名字 !”出现在位于文本框与按钮之间的标签上。
创建并测试新工程
开发新应用,从创建一个 Xcode 新工程开始。
如何创建新工程…
- 打开 Xcode(默认位置在 /应用程序 目录下)。
如果你从未使用 Xcode 创建或打开过工程,你将看到和图中类似的 Xcode 欢迎界面:如果你曾经创建或打开过 Xcode 工程,你可能就会看到工程窗口,而不是欢迎界面。
- 在 Xcode 欢迎界面中,点选“Create a new Xcode project”(或点选 File > New > Project)。
Xcode 将开启一个新窗口并显示对话框,让你选择一个模板。Xcode 内置了几套应用模板,可以方便开发常规 iOS 应用。例如,Tabbed 模板能够创建一个和 iTunes 类似的应用,而 Master-Detail 模板能够创建和 Mail 相似的应用。- 在对话框左侧的 iOS 部分选择 Application。
- 在对话框右侧的主要区域选择 Single View Application 然后点按 Next。
接下来的对话框会让你输入应用的名称,以及关于工程的一些额外信息。- 填写 Product Name(产品名称)、Company Identifier(公司标识)以及 Class Prefix(类前缀)。
你可以按下面的内容填写:
- Product Name:HelloWorld
- Company Identifier:如果你有公司,就填写公司名称。如果没有,就填写 edu.self。
- Class Prefix:HelloWorld
注意:Xcode 会使用你输入的产品名称为工程以及应用程序命名。Xcode 会使用你提供的类前缀名称来命名它为你创建的类。例如,Xcode 会自动创建一个应用委托类并将其命名为 HelloWorldAppDelegate。如果你填写了其他的类前缀,那么应用委托就会被命名为 你的前缀名称AppDelegate。(之后你会了解更多关于应用委托的内容。)
为了讲解的方便,本教程假定你的产品名为 HelloWorld 并且你使用 HelloWorld 作为类前缀。
- 在 Device Family 弹出菜单中,确认选中了 iPhone。
- 请确认 Use Storyboards 和 Use Automatic Reference Counting 选项是选中的,并且 Include Unit Tests 选项不被选中。
- 点按 Next.
会出现另一个对话框,可以选择在哪里保存工程文件。- 选择一个保存位置(不要选中 Source Control 选项),然后点按 Create 完成创建。
Xcode 便会打开一个新工程窗口(我们叫它工作区窗口),看上去应该和下图类似:
花几分钟时间来熟悉一下 Xcode 为你打开的工作区窗口吧。在接下来的教程里,你会经常用到图中不同的区域和按钮。
如果你的工作区窗口里已经打开了实用工具区域(如上图的黄色区域),你可以暂时将其关闭,稍后才会用到它。在 View 按钮中最右边的就是实用工具区域的开关。当实用工具区域是显示状态时,该按钮应该是按下去的:
如果需要,则可以点按 View 按钮中的最右边一个来关闭实用工具区域。
尽管迄今为止你连一行代码都没有写,其实你已经可以编译此应用并在 iOS 模拟器中运行(已包含在 Xcode 中)。人如其名,iOS 模拟器能够让你直观感受你的应用在 iOS 设备上运行起来是什么样子。
如何在 iOS 模拟器中运行你的应用…
- 首先确认一下 Xcode 工具条里的 Scheme 菜单选中了 HelloWorld > iPhone 5.0 Simulator。
如果该菜单显示的不是这一项,那么点开它并选择 iPhone 5.0 Simulator。- 点按 Xcode 工具条中的 Run 按钮(或点选 Product > Run)。
Xcode 会在工具条中央的活动查看器里实时显示构建过程。
当 Xcode 完成构建过程之后,模拟器就会自动运行(可能要等几秒模拟器才会出现在工作区窗口上方)。因为你已经选择过 iPhone(而不是 iPad),所以模拟器会显示一个和 iPhone 一样的界面。在虚拟的 iPhone 屏幕上,模拟器会自动运行你的应用,看上去应该是这样的:
现在,你的应用里什么也没有:它仅仅显示一个白屏。要了解这个白屏来自哪里的话,你需要学习代码里的对象,并且学习它们如何协同工作启动这个应用。现在,请退出模拟器(点选 iOS Simulator > Quit iOS Simulator。请注意不要退出 Xcode)。
在你运行应用到时候,Xcode 可能会展开工作区窗口底部的 Debug(调试)区域。在本教程里你不会用到这个区域,你可以将其关闭。
如何关闭调试区域…
- 点按工具条里 View 按钮中的调试按钮。
View 按钮中的调试按钮是中间一枚,图标是这样的:
弄明白一个应用是如何运行起来的
由于你的工程是基于 Xcode 的一个模板建立的,在运行应用的时候,大部分基础应用环境已经自动设置好了。例如,Xcode 会创建一个应用程序对象,它能够建立一个运行循环(Run Loop,即一种事件处理循环。它能够输入资源并让接收到的事件传送到你的应用里去)。这里的大部分工作是由 UIApplicationMain函数完成的,这个函数是由 UIKit 框架提供的,在工程 main.m 源文件里已经自动被调用。
注意:UIKit 框架提供了一个应用所需的从构建到管理用户界面的所有类。UIKit 框架只是 Cocoa Touch 面向对象框架中的一种,它专为 iOS 应用环境服务。
如何查看 main.m 文件的源代码…
- 确保工程导航栏是打开的。
工程导航栏显示了工程里的所有文件。如果工程导航栏没有打开,点按导航栏选择列最左边的的按钮:- 在工程导航栏中打开 Supporting Files 文件夹,点按左侧的三角形按钮即可。
- 点选 main.m。
Xcode 会在此窗口的主要编辑器区域显示文件里的代码,看上去应该和图中类似:
源文件 main.m 里面的 main 函数会调用 UIApplicationMain 函数,并且是被包含在一个自动释放池里的:
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([HelloWorldAppDelegate class]));
}
第一行的 @autoreleasepool 语句可以支持自动引用计数系统(ARC)。ARC 可以自动管理应用中的对象活动周期,确保在程序需要它们的时候一直存在,并在不需要的时候释放这些对象。
调用 UIApplicationMain 函数时会创建一个 UIApplication 类的实例和一个应用委托的实例(在本教程中,应用委托就是 HelloWorldAppDelegate,这是 Single View 模板自带的)。应用委托的主要任务就是提供一个窗口,从而让你的应用能够在里面绘制内容。应用委托还能在应用界面显示出来之前执行一些配置任务。(委托机制是一种设计模式,它规定:一个对象要代表另一个对象,或与另一个对象协同进行活动。)
在 iOS 应用中,窗口对象提供了一个可见容器,帮助把事件传送到应用对象中去,并且帮助应用响应设备在方向上的改变。而窗口本身是不可见的。
调用 UIApplicationMain 函数同时还会扫描应用的 Info.plist 文件,这个文件是一个包含应用名称、图标等信息的属性列表文件(即结构化的键/值对列表)。
如何查看属性列表文件…
- 在工程导航栏的 Supporting Files 文件夹里,点选 HelloWorld-Info.plist。
Xcode 会在编辑器区域显示 Info.plist文件的内容,看上去应该和图中类似:在本教程中,你暂时无需了解 Supporting Files 文件夹里的任何文件,所以可以收起它避免影响视线。收起文件夹也是点按 Supporting Files 文件夹左侧的小三角按钮。
因为你刚才选择在此工程里使用故事板,于是 Info.plist 文件里同样也会包含应用程序对象需要载入的故事板文件的名称。故事板里包含了定义此应用程序用户界面的对象、过渡(Transition)以及连接(Connection)。
在 HelloWorld 应用中,故事板文件被命名为 MainStoryboard.storyboard(注意,Info.plist 文件只会显示文件名的前半部分)。当应用启动时,MainStoryboard.storyboard 会被加载并且初始视图控制器(Initial View Controller)会通过它创建实例。视图控制器(View Controller)是一个对象,用来管理一片区域中的内容;初始视图控制器就是应用启动时被载入的第一个视图控制器。
HelloWorld 应用只含有一个 View Controller(说白了就是 HelloWorldViewController)。现在,HelloWorldViewController 管理着一片区域的内容,它就是由一个视图(view)提供的。视图也是一种对象,它能够在屏幕上一个矩形区域内进行绘制,并且处理用户点、触时产生的事件。一个视图中可以包含其他视图,被包含的视图就叫做子视图。当你向一个视图内添加子视图时,最外层的视图叫做父视图,而它的子视图按理就被称为孩子视图。父视图和一系列孩子视图(如果继续包含下去,孩子视图还会有自己的孩子视图)共同构成视图层级。一个视图控制器管理一个层级的视图。
注意:HelloWorld 应用对象被定义为一种叫做模型-视图-控制器(MVC)的设计模式,视图及视图控制器就是这三个角色中的两个。第三个角色就是模型对象。在 MVC 里,模型对象代表数据(例如日历应用里的一个代办事项,或某画图应用里的一个形状),视图对象知道如何显示模型对象所提供的数据,而控制器对象则是模型和视图中间的连接部分。在 HelloWorld 应用里,模型对象是一个用来保存用户输入的姓名的字符串。目前你不用太深入地了解 MVC,但是如果能够在设计过程中时刻想象你应用中的对象是如何扮演这三个角色的也很棒。
在接下来的步骤中,你需要在 HelloWorldViewController 管理的视图中添加三个子视图来形成视图层级;这三个子视图分别是一个文本框、一个标签和一个按钮。
在故事板中你可以看到视图控制器和视图的可视化表现形式。
如何查看故事板…
- 在工程导航栏中点选 MainStoryboard.storyboard。
Xcode 会在编辑器区域打开故事板。(而故事板后边的区域,也就是看上去像空白图纸的区域,叫做画布(Canvas))。
当你打开默认的故事板时,工作区窗口看起来应该和图中类似:
每个故事板都包含若干 Scene(场景)和 Segue(接续)。场景代表一个视图控制器,接续代表两个场景之间的过渡转换。
由于 Single View 模板只提供一个视图控制器,所以你应用的故事板里就只有一个场景,没有接续。画布上场景左侧的一个箭头是初始场景指示器,表明它指着的场景是应用载入时第一个显示的场景(典型情况下初始场景就相当于初始视图控制器)。
你在画布上看到的这个场景名称是 Hello World View Controller 因为它受 HelloWorldViewController 对象的管理。Hello World View Controller 是由 Xcode 大纲视图里显示的若干个部件构成的。大纲视图就是画布和工程导航栏之间的那一栏。目前,视图控制器包含一下几个部件:
- 一个 first responder 占位符对象(由一个橙色的立方体标示)。 这里的 first responder 是一个动态占位符,代表应用运行过程中应该最先接收事件的对象。这些事件包括编辑焦点事件(例如点按文本框时呼出键盘),动作事件(例如摇晃设备),以及动作消息(例如用户按下的按钮发出的消息),等等这些。在本教程中你无需对 first responder 做任何修改。
- 一个 HelloWorldViewController 对象(由一个嵌有矩形面板的橙色球体代表)。 当故事板载入一个场景时,它就会创建一个视图控制器类的实例来管理这个场景。
- 一个视图,它被列在视图控制器的下边(要在大纲视图里显示这个视图,你需要点按 Hello World View Controller 旁边的三角形按钮来展开)。 这个视图的白色背景便是你在模拟器中运行应用时看到的白屏。
注意:应用的窗口对象并不在故事板里。
画布中场景下面的部分叫做 Scene Dock(场景坞)。现在场景坞里显示了一些视图控制器的名称(也就是 Hello World View Controller)。在其他时候,场景坞可能包含一些代表 first responder 和视图控制器对象的图标。