20.2 第一个iOS应用HelloWorld

在学习之初,我们有必要对使用Xcode创建iOS工程做一个概览,这里我们通过创建一个基于Swift语言的HelloWorld的iPhone工程来详述其中涉及的知识点。

实现HelloWorld应用后,会在界面上展示字符串Hello World(效果如图20-1所示),其中主要包含Label(标签)控件和ImageView(图片视图)。

{%}

图 20-1 HelloWorld的iPhone界面

20.2.1 创建工程

我们在前面的章节介绍过创建iOS工程,但并没有详细解释,为了完整地介绍HelloWorld应用开发过程,我们还是从创建工程开始介绍。

启动Xcode 6,然后单击File→New→Project菜单,在打开的Choose a template for your new project界面中选择“Single View Application”工程模板(如图20-2所示)。

{%}

图 20-2 选择工程模板

接着单击“Next”按钮,随即出现如图20-3所示的界面。

{%}

图 20-3 新工程中的选项

图20-3所示的内容是创建新工程所需的基本信息,其中选项说明如下。

  • Product Name。工程名字。

  • Organization Name。组织名字。

  • Organization Identifier。组织标识(很重要)。一般情况下,这里输入的是组织名或公司的域名(如net.cocoagame),类似于Java中的包命名。

  • Bundle Identifier。捆绑标识符(很重要)。该标识符由Product Name+ Organization Identifier构成。因为在App Store发布应用的时候会用到它,所以它的命名不可重复。

  • Language。开发语言选择。我们在这里可以选择开发应用所使用的语言,Xcode 6中可以选择Swift和Objective-C。

  • Devices选项。这是选择应用运行的设备,可以构建基于iPhone或iPad的工程,也可以构建通用工程。通用工程是指在iPhone和iPad上都可以正常运行的工程。

我们可以根据自己的实际情况和需要输入相关内容。设置完相关的工程选项后,单击“Next”按钮,进入下一级界面。根据提示选择存放文件的位置,然后单击“Create”按钮,将出现如图20-4所示的界面。

{%}

图 20-4 新创建的工程

在左边的导航栏中双击打开Main.storyboard文件,看到如图20-5所示的设计界面,这个设计界面是使用Interface Builder(IB)工具打开的。Xcode 4.1之后,Interface Builder被集成到了Xcode开发工具中。

{%}

图 20-5 Interface Builder设计界面

默认情况下,设计界面尺寸是通用大小,我们需要根据应用的实际情况,改变设计界面的大小。由于我们的HelloWorld是为iPhone5以上4英寸屏幕设备开发的应用,所以需要改变设计界面的大小,单击图20-6中设计下面的“wAny hAny”(Size Classes1)按钮,在弹出的预览框中,拖动鼠标选择区域。改变之后的设计界面如图20-7所示。

1Size Classes(尺寸分类),注意它不是Size类的意思,而是iOS 8推出的解决各种不同屏幕尺寸适配问题的技术。

{%}

图 20-6 改变设计界面的大小

{%}

图 20-7 改变尺寸后的设计界面

在右下角的对象库中选择Label控件,将其拖曳到View设计界面上并调整其位置,如图20-8所示。双击Label控件,使其处于编辑状态(也可以通过控件的属性来设置),在其中输入“Hello World”。

提示 右下角的窗口默认情况下显示的并非是对象库,我们需要按图20-8所示点击显示对象库按钮{%}使之显示。还有,左边的场景窗口能够查看当前界面中有哪些视图控制器、视图和控件,关闭和打开场景窗口,可以通过图20-8所示按钮{%}实现。

{%}

图 20-8 添加Label控件

接下来添加ImageView(图片视图)到View的设计界面,从右下角的对象库中选择ImageView控件,将其拖曳到View上,如图20-9所示。ImageView是图片的容器,它的大小应该跟原始图片是一样的,否则都会比率失调或者失真,因此需要设置它的尺寸。在View设计视图中选择ImageVew,然后再选中右边的尺寸检查器{%},按照如图20-10所示的尺寸设置,其中X和Y代表坐标,WidthHeight代表宽和高,将WidthHeight都设置为76点2,这是因为要放置的图片大小是152×152(像素),对于iOS Retina显示屏而言,1点=2倍像素。修改完WidthHeight属性后,重新摆放ImageView控件使其居中。

2iPhone 6 Plus显示屏中,1点 = 3倍像素。iPhone 6、iPhone 5/5s/5c(iPod touch 5)、iPhone 4s、iPad Air、iPad 3、iPad mini 2显示屏中,1点 = 2倍像素。iPad 2、iPad mini、iPhone 4之前的设备显示屏中,1点 = 1倍像素。

{%}

图 20-9 添加ImageView

{%}

图 20-10 设置ImageView尺寸

设置好ImageView尺寸后,本例可以设置它所关联的图片,但是现在你的工程中是没有图片的,需要通过Xcode将图片添加到工程中。具体步骤是,如图20-11所示,右键选择Supporting Files组,选择菜单中的Add Files to “HelloWorld”…弹出选择文件对话框。如图20-12所示,在Destination中选中Copy items if needed,这样可以将文件复制到我们的工程目录中,在Add to targets中选择HelloWorld。

{%}

图 20-11 添加文件

{%}

图 20-12 选择文件对话框

把图片文件添加到工程后,我们再选择ImageView,然后打开右边的属性检查器{%},在Image View→Image下的列表中选择图片文件(icon-152.png),如图20-13所示。

{%}

图 20-13 设置ImageView属性

至此,整个工程创建完毕。如图20-14所示,选择运行的模拟器或设备,然后单击左上角的运行按钮{%},即可看到图20-15所示的运行结果。

{%}

图 20-14 运行应用

{%}

图 20-15 运行结果

我们在没有输入任何代码的情况下,就已经利用Xcode工具的Single View Application模板创建了一个工程并成功运行,Xcode之强大可见一斑。

20.2.2 Xcode中的iOS工程模板

从图20-16中可以看出,iOS工程模板分为3类——Appliction、Framework & Library和Other,下面将分别详细介绍这3类模板。

  1. Application类型

大部分开发工作都是从使用Application类型模板创建iOS程序开始的。该类型共包含5个模板,具体如下所示。

  • Master-Detail Application。可以构建树形结构导航模式应用,生成的代码中包含了导航控制器和表视图控制器等。

  • Page-Based Application。可以构建类似于电子书效果的应用,这是一种平铺导航。

  • Single View Application。可以构建简单的单个视图应用。

  • Tabbed Application。可以构建标签导航模式的应用,生成的代码中包含了标签控制器和标签栏等。

  • Game。可以帮助开发iOS游戏应用,其中包括几个苹果自己的游戏引擎,以及直接使用Open GL开发iOS 3D游戏。

  1. Framework & Library类型

Framework & Library类型的模板如图20-16所示,它可以构建基于Cocoa Touch框架和Cocoa Touch的静态库。

{%}

图 20-16 Framework & Library类型模板

  1. Other类型

利用该类型,我们可以构建应用内购买内容包(In-App Purchase)和空工程,如图20-17所示。使用应用内购买内容包,可以帮助我们构建具有内置收费功能的应用。

{%}

图 20-17 Other类型模板

我们可以根据需要选用不同的工程模板,这可以大大减少我们的工作量。

20.2.3 程序剖析

在创建HelloWorld的过程中,生成了很多文件(展开Xcode左边的项目导航视图可以看到,如图20-18所示),它们各自的作用是什么?彼此间又是怎样的一种关系呢?

如图20-18所示,导航视图下有HelloWorld、HelloWorldTests和Products这3个组。其中,HelloWorld组中放置HelloWorld工程的主要代码,而HelloWorldTests组中放置的是HelloWorld程序的单元测试代码。Frameworks放置HelloWorld代码所依赖的框架或库,Products组放置了编译后的工程。下面我们重点介绍HelloWorld组中的内容。

{%}

图 20-18 HelloWorld工程导航面板

在HelloWorld组中共有两个Swift文件:AppDelegate.swift和ViewController.swift,以及一个组Supporting Files。我们主要的编码工作就是在AppDelegate.swift和ViewController.swift这两个Swift文件中进行的,在这两个文件中分别定义了两个类AppDelegateViewController,它们的类图如图20-19所示。

{%}

图 20-19 HelloWorld工程类图

AppDelegate是应用程序委托对象,它继承了UIResponder类,并遵守了UIApplicationDelegate委托协议。UIResponder类可以使子类AppDelegate具有处理相应事件的能力,而UIApplicationDelegate委托协议使AppDelegate能够成为应用程序委托对象,这种对象能够响应应用程序的生命周期。相应地,AppDelegate的子类也可以实现这两个功能。

ViewController类继承自UIViewController类,它是视图控制器类,在工程中扮演着根视图和用户事件控制类的角色。

在HelloWorld启动过程中,操作系统首先实例化AppDelegate类,这是因为AppDelegate类被标注为@UIApplicationMain的,说明AppDelegate是iOS应用程序的入口,这个类还必须实现UIApplicationDelegate委托协议。AppDelegate类相关代码如下所示:

  1. importUIKit
  2. @UIApplicationMain
  3. classAppDelegate: UIResponder, UIApplicationDelegate {
  4. var window: UIWindow?
  5. ......
  6. }

AppDelegate类是应用程序委托对象,这个类中继承的一系列方法在应用生命周期的不同阶段会被回调。启动HelloWorld时,首先会调用application:didFinishLaunchingWithOptions:方法,该方法的代码如下:

  1. func application(application: UIApplication, didFinishLaunchingWithOptions
  2. launchOptions: [NSObject: AnyObject]?) -> Bool {
  3. // Override point for customization after application launch.
  4. return true
  5. }

在HelloWorld组中还有Images.xcassets文件夹(灰色的是文件夹,黄色的是组),它可以放置工程中的图片。

提示 “文件夹”与“组”的区别是,在访问资源文件时,文件夹中的资源在访问路径里需要这个路径。如果一个icon.png文件放在image文件夹下,访问它的路径是“image/icon.png”,如果image是组,则访问它的路径是“icon.png”。

默认情况下Supporting Files组只有一个文件Info.plist,Info.plist是当前工程属性描述文件,它的默认名是Info.plist,如果想使用其他的名字,需要在编译参数(build settings)中重新设置。