你已经创建了自己的第一个iPhone应用程序!
深入浅出iPhone/iPad开发(第2版)
所有的部分都连接在一起。
描述界面。
iDecide由2个nib组成:MainWindow.xib和iDecideViewController.xib。合在一起,它们是用户看到的UI。
视图在视图控制器中被连接到代码。
我们的视图通过界面构建器被连接到实现代码,使用的是IBOutlets和IBActions。IBOutlets给予我们到UI组件的引用,而IBActions在事件发生时被调用。
在视图控制器中实现我们的应用程序的行为。
遵循MVC模式(或者实际上只是VC模式),我们拥有在视图控制器中实现的所有的行为,清晰地与视图本身分离开。如果需要更新,视图控制器使用IBOutlets返回我们的实际UI控件。
界面构建器创建nib文件(使用.xib扩展名),并用XML描述GUI。
nib文件通过CocoaaTouch框架加载,并在运行时变成CocoaaTouch类的具体实例。
为了将在一个nib中描述的组件连接到你的代码,你使用IBOutlets和IBActions。
Xcode是为应用程序维护你的代码和文件的地方。
Xcode是你的项目开发的中心,并为编辑你的代码,创建你的应用程序,并在运行它时进行调试提供支持。
iPhone模拟器让你可以不需要真正的设备,而只在Mac上测试你的应用程序。
这里没有愚蠢的问题
问:文件的所有者是什么意思?
答:界面构建器期望什么类都有个nib文件的所有者。你可以改变该类在界面构建器中认为的是什么,但是默认的是,一个由Xcode主要视图控制器创建的新建立的项目,便是通过Xcode创建主要视图的文件所有者。这就是为什么我们没有改变任何东西的原因。由于文件的所有者是我们的iDecideViewController建立的,界面构建器查看iDecideViewController的头文件,并理解为我们有一个名为descriptionText的IBOutlet和一个名为buttonPressed的IBAction。当你连接UILabel的引用接口到文件所有者descriptionText时,界面构建器保存必要的信息,以便当nib通过应用程序被加载时,在我们的iDecideViewController中引用会被正确设置。同样的事情也发生在TouchUpInside事件,除了在这种情况下,不是一个组件连接一个引用,而是一个组件的事件连接到一个应该被调用的方法。
注意(界面构建器的类期望会被加载到nib,但并不意味着其他的类不能尝试加载),如果那个类没有必要的属性和方法,它只是可能工作得不好。
问:为什么我们的新文本字符串前面会有一个@?
答:CocoaaTouch框架为它的文本字符串使用一个字符串类名为NSString。由于它是如此普遍,Objective-C内置支持从常量创建它们。如果你表示一个字符串常量,则应该在NSString之前放置一个@字符。否则,它只是一个类似C或C++中的普通char*。
问:我们已经介绍的内容有多少是专门针对iPhone的?为iPod Touch或iPad做开发会有很大不同吗?
答:不全是!开发iOS的一个好处是,大部分为一种iOS设备创建的东西可以直接应用到另一种iOS设备上。你需要关心的是相关设备的专用硬件能力(例如,尝试在一款较旧的iPod Touch或iPad上使用摄像机功能是不会工作的),以及你的视图与图像的屏幕分辨率是否需要改变,但除此之外,为不同设备做开发还有更多你需要注意的。
如果你在脑海中坚持MVC模式,并确保从视图中分离出了逻辑,这会使你为应用程序添加新视图变得更加容易。
问:Xcode实际上是怎么构建应用程序的?
答:我们打算在接下来的内容中来更多地讲一讲。简单表述为,Xcode可以集齐所有你的资源和代码,将它们连接在一起,然后最终糅合出一个不错的程序,放入你的iOS设备上。
问:为什么我一直听到界面构建器?它究竟是什么?
答:在以前,Xcode 4的视图在一个单独的应用程序中被编辑,叫做界面构建器。现在它是Xcode的一部分,实际上不再叫界面构建器。由于需要过渡,人们可能依旧在工作中或聊天中称之为IB(界面构建器)。
问:当视图被编译时,为什么还是.xib文件?难道不该改变点什么吗?
答:在编译后,.xib文件实际上是.nib文件的二进制形式。
问:我不断听到的“无正式文件的API”究竟是什么?
答:它们是苹果使用的私有方法,但是你不能用。多任务就是一个例子。它刚刚成为可供开发人员在iOS 4中使用的方法,但一些苹果的应用程序已经能够从一开始就在后台运行(例如,当你切换到其他应用程序的时候,iPod应用程序不会停止播放)。
你通常看到当开发人员试图自定义一个标准的iOS控件或者改变一个物理按键的作用时,会触碰到无正式文件的私有方法。不要这样做。苹果会在审核期间查出来,并拒绝让你的应用程序通过。苹果保护这些API是保护它们平台的一部分,并且现在的无正式文件也许会在未来允许使用。
你的任务是从游泳池中选择文件名称,并遵循图中的意思把它们放入相应的空白行中。一个文件名不能使用两次,且文件名称不必全部使用。你的目标是完成该图,使该图解表示出iDecide的设计过程。
exercise_pool_chair.jpg游泳池解谜答案
你的任务是从游泳池中选择文件名称,并遵循图中的意思把它们放入相应的空白行中。你不能使用相同的文件名称,且文件名称不能全部使用。你的目标是完成该图,使该图解表示出iDecide的设计过程。
开动脑筋,思考那些我们在这一章中使用的新术语对应的英文单词。
4.一些不能依靠模拟器测试的东西。
5.这是用来建立一个从实现代码到视图的输出连接。
7.该术语用来描述一个iPhone应用程序中的每一个屏幕。
8.用于编写iPhone应用程序的框架。
10.在应用程序中用于组织图形的文件夹。
12.对iPhone应用程序使用的IDE名称。
13.在Xcode中使用,以提供类的访问。
纵向的
1.用来编写iPhone应用程序的语言。
2.用来在台式机上测试应用程序。
3.用于接收代码中的事件,并触发一些事情。
6.这是一个编辑器的名字,用于Objective-C。
9.iPhone是这种类型的设备。
11.用于创建视图的文件的名字。
exercise_puzzle.jpgiOS填字游戏
开动脑筋,思考那些我们在这一章中使用的新术语对应的英文单词。
4.一些不能依靠模拟器测试的东西。(PERFORMANCE)
5.这是用来建立一个从执行代码到视图的输出连接。(IBOUTLET)
7.该术语用来描述一个iPhone应用程序中的每一个屏幕。(VIEW)
8.用于编写iPhone应用程序的框架。(COCOATOUCH)
10.在应用程序中用于组织图形的文件夹。(RESOURCES)
12.对iPhone应用程序使用的IDE名称。(INTERFACEBUILDER)
13.在Xcode中使用,以提供类的访问。(FRAMEWORKS)
纵向的
1.用来编写iPhone应用程序的语言。(OBJECTIVEC)
2.用来在台式机上测试应用程序。(SIMULATOR)
3.用于接收代码中的事件,并触发一些事情。(IBACTION)
6.这是一个编辑器的名字,用于Objective-C。(XCODE)
9.iPhone是这种类型的设备。(MOBILE)
11.用于创建视图的文件的名字。(NIB)