1您的第一个iPhone应用程序介绍本教程向您演示如何创建一个简单的iPhone应用程序。本文不打算对iPhone目前可用的特性作全面介绍,而是介绍一些技术,让您对基础开发过程有初步了解。如果您刚开始使用CocoaTouch进行iPhone开发,则您需要阅读本文档。阅读之前,您需要大致了解计算机编程基础,尤其是要了解Objective-C。如未曾用过该语言,则至少应通读学习Objective-C:入门教材。本文档不是为了创建一个优雅漂亮的应用程序,而是为了向您描述:如何使用Xcode创建并管理一个工程基础设计模式和iPhone开发的基本技术InterfaceBuilder使用入门如何让应用程序响应来自标准用户接口控件的用户输入另外,我们还在教程中指出其他一些文档。只有阅读这些文档,您才能充分理解iPhone开发的工具和技术。重要:为了学习本教程,您需要安装iPhoneSDK和开发者工具,它们位于iPhone开发中心。文档描述的工具包含在iPhoneSDKv3.0里面—请检查一下Xcode版本,它不能低于3.1.3。文档的组织方式本文档分为如下章节:“教程概述和设计模式”“创建您的工程”“添加一个视图控制器”“检查Nib文件”“配置视图”“实现视图控制器”“排除疑难”“下一步做什么?”教程概述和设计模式本章概述您将要创建的应用程序以及将会使用的设计模式。2教程概述在学习过程中,您将创建一个很简单的应用程序。它含有一个文本字段,一个标签和一个按键。您可以把名字输入到文本字段中,再按下按键,这时标签的文本就会变成“Hello,Name!”:尽管这是个很简单的应用程序,但它介绍了基本的设计模式、工具、以及利用CocoaTouch进行iPhone开发的基础技术。CocoaTouch包括UIKit和Foundation这两个框架。当在iPhneOS上开发事件驱动的图形化应用程序时,您需要使用它们提供的工具和基本结构。同时,CocoaTouch还包含其他几个框架,它们提供一些基本的服务,可用于访问设备的特色内容,例如访问用户的联系人。如需要进一步了解CocoaTouch及其在哪些方面适应于iPhoneOS,请阅读iPhoneOS技术概览。另外,我们将在“设计模式”一节中描述您将使用的主要的设计模式。虽然本教程不太顾及用户界面,但应用程序的表现形式是其获得成功的关键。您应该阅读iPhone人机接口指南并且研究基于本文档的样例代码(HelloWorld),这样您才能明白如何改善用户接口,以使其成为一个成熟的应用程序。同时,您也将了解视图控制器如何工作以及它如何同iPhone应用程序的的架构相适应。3设计模式请务必阅读Cocoa基础指南的设计模式这一章。您将使用主要的模式如下:委托模型视图控制器目标-动作下面对这些模式作简单介绍并且指出应用程序在什么地方会使用它们。委托委托模式是一个对象周期性地向被指定为其委托的另一个对象发送消息,向其请求输入或者通知某件事情正在发生。该模式可替换类继承来对可复用对象的功能进行扩展。在本文将要创建的应用程序中,应用程序对象会向其委托发送消息,通知它主要的启动例程已经完成并且定制的配置可开始执行。为了建立并管理视图,委托会创建一个控制器实例。另外,当用户点击Return按键后,文本字段也会通知它的委托(即所创建的控制器对象)。委托方法通常会集中在一起形成一份协议。一份协议基本上就是一个方法的列表。如果一个类遵循某个协议,则它要保证实现协议所要求的方法(有些方法可选择实现与否)。委托协议规定了一个对象可以发送给委托的所有消息。如果需要进一步了解协议及其在Objective-C中的作用,请查看Objective-C编程语言的协议。模型-视图-控制器模式-视图-控制器(或者“MVC”)设计模式把应用程序中的对象设定为三种角色。模型对象表示数据。例如,在一款游戏中,SpaceShips和Rockets是模型对象,在一个用于生产的应用中,ToDo项和Contacts是模型对象,在一个绘画应用中,Circles或Squares是模型对象。本文将创建的应用程序用到的数据非常简单-仅仅是一个字符串-并且该字符串只在一个方法中使用,因此,严格说,我们甚至没有必要在程序中使用模型对象,但是程序所用到的设计原理却非常重要。在其他的应用程序中,模型对象将会更加复杂并且可以在多个地方进行访问。视图对象知道如何显示数据(模型),并且它们有可能会允许用户对数据进行编辑。在本文将要创建的应用程序中,您需要一个主视图来包含其它几个视图—一个文本字段,它用于捕获用户输入信息;第二个文本字段,它用于显示文本,而文本内容则是基于用户的输入;另外还需要一个按键,用户利用它来告知我们第二个文本字段应该被更新。控制器对象位于模型和视图之间。4在本文将要创建的应用程序中,控制器对象将会从输入文本字段中取得数据,并把数据存放在一个字符串中,然后再把第二个文本字段的内容更新成恰当的值,更新操作则由按键发送出来的动作触发。目标-动作目标-动作机制允许一个控件对象(诸如按键或滑动条)向另外一个对象发送一条消息(即动作),以之作为对某个用户事件(例如一个点击事件或者一个敲击事件)的响应。接收到消息的对象则可以对消息进行解释,并将其作为一个特定于应用程序的指令进行处理。在本文将要创建的应用程序中,当按键被敲击时,它会通知控制器根据用户的输入更新模型和视图。创建工程在本章,您将使用Xcode创建前面所说的工程,同时还将查明应用程序的启动过程。Xcode我们主要利用Xcode来创建iPhone应用程序,它是苹果的IDE(集成开发环境)。您也可以利用它来创建各种不同类型的工程,包括Cocoa以及命令行工具。请注意:本书,我们约定表示一个段落的开始(有时,该段落包含其后的无序列表),而段落内容是教程里需要您执行的操作。代码列表不显示Xcode的模板文件里的注释。启动Xcode(缺省情况下,Xcode位于/Developer/Applictions里面),然后请选择FileNewProject,这样就可以创建一个新工程。您应该会看到一个新的窗口,它和下图相似:5请注意:如果您没有看到“UseCoreDataforstorage”这一选项,则请您务必您安装iPhoneOSSDK3.0版本—您应该安装Xcode3.1.3或者更高的版本。请选中Window-BasedApplication并点击Choose按键。(请不要勾选“UseCoreDataforstorage”,本例不使用CoreData机制。)完成上述步骤后,屏幕会出现一张表格。请在上面选择工程的存储位置。请选择一个合适的位置(例如您可以放在桌面也可以放在一个定制的工程目录),然后为工程添加一个名称—HelloWorld—再点击保存按键。请注意:在后续章节中,我们假定您将工程命名为HelloWorld,因此应用程序的委托类就叫做HelloWorldAppDelegate。如果使用其他名称,则应用程序委托类的名称将为YourProjectNameAppDelegate。完成上述步骤后,您将看到如下的新工程窗口:6如果以前未曾用过Xcode,则请花点时间来研究下该应用。请阅读Xcode工作空间指南,它可以帮助您理解工程窗口的组织方式以及如何执行诸如编辑和保存文件这样的基本任务。现在,您可以链编并运行程序,这样就能看到模拟器的外观。请选择BuildBuildandGo(Run)或者点击工具栏中的BuildandGo按键。iPhone模拟器应该会自动启动。当您的应用程序启动后,您只看到一个白色屏幕。如希望了解白色的屏幕从何而来,则您需先了解应用程序如何启动。退出模拟器。应用程序引导您创建的模板工程已设置了基本的应用程序环境。它创建一个应用程序对象,将应用程序和窗口服务器连接起来,建立一个运行循环以及其他等等。大部分的工作通过UIApplicationMain函数完成,请看图2-1。图2-1应用程序引导7main.m文件中的main函数会调用UIApplicationMain函数:intretVal=UIApplicationMain(argc,argv,nil,nil);该函数将会创建一个UIApplicaion类的实例。同时它会搜索应用程序的Info.plist属性列表文件。Info.plist文件是一部字典,它包含诸如应用程序名称、图标这样的信息。它也可以包含应用程序对象应该加载的nib文件的名称,该名称由NSMainNibFile键指定。Nib文件含有一份用户接口元素及其他对象的档案—您将在后续章节进一步了解Nib文件的知识。本工程的Info.plist文件具有下面的内容:keyNSMainNibFile/keystringMainWindow/string这表明应用程序启动时将会加载MainWindownib文件。如希望查看nib文件,请双击工程窗口Resourcegroup中的MainWindow.xib文件。(虽然该文件的扩展名为“xib”,但是我们习惯称之为“nib文件”)。InterfaceBuilder将会启动并打开该文件。8InterfaceBuilder文档包含四个对象:一个文件拥有者代理对象。实际上,文件拥有者对象是UIApplication实例—我们将在“文件拥有者”一节讨论该对象。一个第一响应者代理对象。本教材并未使用第一响应者,但是您可以阅读iiPhone应用程序的编程指南中的事件处理以了解更多信息。一个HelloWorldAppDelegate的实例,它会被设置成应用程序的委托。我们将在下一节讨论委托。一个窗口。它被设置为白色背景、启动时可见。应用程序启动时,您看到的窗口就是它。应用程序完成启动后,您可以执行附加定制。下图描述一种通用模式-您将在下一章使用它:9应用程序对象在完成启动后会向委托发送applicationDidFinishLaunching:消息。通常情况下,委托不是自己配置用户接口,而是创建一个视图控制器对象(一种特定的控制器,它负责管理一个视图—遵循“模型-视图-控制器”描述的模型-视图-控制器设计模式)。然后委托向视图控制器请求视图(这个视图由视图控制器根据要求创建),并将其添加成窗口的子视图。小结在本章,您创建了一个新工程并学习了应用程序的启动过程。下一章,您将定义并创建一个视图控制器实例。添加一个视图控制器在本文档的示例程序中,您需要使用两个类。一个是Xcode的应用程序模板提供的应用程序委托,程序在nib文件中创建了一个该类的实例。另一个是需要您实现视图控制器类,您将创建该类的一个实例。添加一个视图控制器类在大部分iPhone应用程序中,视图控制器起着核心作用。正如其名称所示,它负责管理一个视图。在iPhone上,它们也帮助进行导航和内存管理。虽然本节例子程序不使用后两种功能,但对此有所了解很重要。UIKit提供一个特别的类—即UIViewController类—它封装了视图控制器应该具有的大部分缺省行为。您应从它派生子类,在子类中定制应用程序的行为。请选中Xcode项目管理器里的工程(即HelloWorld项目,位于GroupsandFiles列表的顶部)或者选中Classes文件夹—新文件会被加入到当前选择的位置。请选择FileNewFile。在NewFile窗口中,请选择CocoaTouchClasses,然后选择UIViewControllersubclass。同时,请勾选Options区域中标题为WithXIBforuserinterface的选择框。10请注意:如果您没有看到“WithXIBforuserinterface”选项,请确保您安装iPhoneOSSDK3.0版本-您应该安装Xcode3.1.3或者更高的版本。选中“WithXIBforuserinterface”表明Xcode在创建视图控制器的同时,会为其创建一份nib文件,并将该文件添加到