CS193P第四堂课摘要及心得笔记
在历经前面几堂课的洗礼,相信各位读者一定已经对 Obj-C 有个深刻的体验。接下来在这堂课中,我们将进一步的前进到 iPhone 的程式运作以及 MVC 的架构,你準备好了吗?
iPhone 程式运作週期在一般正常可以运作的 iPhone 程式当中,通常会包含以下四个部份:

而一个程式的生命週期又可以分成五个阶段,分别是:
- 启动程式
- 初始化程式
- 读取 main nib
- 等候 event
- 处理 event,然后回到 4
- 离开程式
我们在前面几次的笔记中曾经屡次谈到 UIKit Framework 在 iPhone 开发上扮演着很重要的功能,它不仅提供了基本的 UI 元素,也帮助了我们解决了许多问题。
UIKit 也帮助我们启动应用程式,所有的应用程式都会有一个单独的 UIApplication 物件,这个物件会帮助我们协调处理上面所提到的物件的各个阶段,也会帮我们分配 event、管理状态列和程式在主画面上的数字显示。
不过为了使用这个 UIApplication 这个类别,我们并不会产生一个子物件去继承 UIApplication,我们使用的是 delegation 的概念。所谓的 delegate 就是委派的意思。也就是当我们要使用 UIApplication 及许多其他的 UIKit 类别时,我们并不会继承这个複杂的类别,而是用一个类别去包含这些物件变数。
诚如我们上面谈的,因为 UIApplication 是每个 iPhone 软体必备的,所以在 Xcode 建立专案的同时,他就会帮我们建立起一组 UIApplication 的 Delegate,并且让我们可以自行实做一些 UIApplication 会呼叫的方法,像是:
- applicationDidFinishLaunching:application; - applicationWillTerminate:application; - applicationWillResignActive:application; - application:application handleOpenURL:url; - applicationDidReceiveMemoryWarning:application;
这些方法包含了当然程式结束、或是记忆体过低等状况时,所需要做的一些处理。
Info.plist在这个档案中,他记载了:
要修改这些内容,在 Xcode 下左手边的清单中,对 Targets 中你的程式按右键选择 Get Info,然后选择 Properties 就可以看到这些设定了!
Model/View/Controller
MVC 架构是现代软体设计中很常见的一种设计模式,就如同他命名一般,软体被分成了三块:
Model 负责管理程式的资料以及状态,同样的 Model 在程式中的不同介面应该要能够拥有一致的操作,以便重複利用。
View 负责把 Model 呈现到使用者介面,作为使用者操作资料的介面。它本身不处理资料相关的程式逻辑,所以如果即便套用上不同的 Model,理论上同一份 View 都能够搭配显示。
Controller 负责处理 Model 跟 View 中间的程式逻辑,使用者面对 View 进行资料的操作,而当 View 接受到这些指令,他就会把这些讯息传递给 Controller,Controller 在根据不同的 Model 进行操作。
在 iPhone 中,一个 Controller 会包含了 outlets 和 actions,outlet 就是 View 跟 Model,而当使用者对 View,也就是使用者见面做操作的时候,就会呼叫 Controller 的 action,而 Controller 在针对 Model 去处理。
Nib
Interface Builder 所产生的 Nib 档提供了我们一种视觉化、简易的方法,来设计 MVC 中的 View,虽然在新版的 Cocoa 中副档名已经改为 xib,不过在苹果的官方文件中仍然统称为 Nib 档。而 Nib 档除了可以排列 UI 元素之外,也可以用增加 controller 物件并且连结 controller 到 UI 上,这些动作会在 Nib 档被读取的同时完成。
然而,我们可以透过实做- awakeFromNib 这个方法,让程式在读取完 Nib 档后进行一些客制化的操作,像是把程式恢复到上次关闭的状态、或是自动开启最后一只档案等等。
Target-Action每个 View 的物件可能会发生很多不同种的事件,像是有:
当一个事件发生时,iPhone 程式会自动呼叫目标物件的相对应动作 ,而这个物件就是 MVC 架构中的 controller。在课程投影片的第 42 张有很详细的图解,如果有不清楚的部份,可以提供参考。
至于我们要如何设定这些 event 和 target 还有 action 的关係呢?我们可以在 Interface Builder 上透过简单的拖曳就可以完成设定,并不需要自己慢慢去撰写物件的关联性。

而 event 所要呼叫的 action,有三种不同的形式,都可以使用:
- actionMethod; - actionMethod:sender; - actionMethod:sender withEvent:event;
最后面一种,其传入的 UIEvent 物件会详细纪录关于事件发生的一些细节,如果需要一些比较细微的处理,就很适合最后一种的形式。
值得注意的是,在 iPhone 平台上,一个事件可以同时触发多个不同的 action,跟 Mac 上的开发环境有所不同。
结论在这次的心得笔记连载中,我们针对了 UIKit 跟 MVC 架构做了粗浅的介绍,也学习了关于 Nib 档的知识以及如何将 View 连结到 Controller 上。在下一次的连载当中,我们将会先就第二次的作业进行讨论,以及讲解一些作业中困难的部份,还请大家继续收看!
参考资源
最新推荐
[李亦伸专栏] Kawhi只有一个去处,湖人必须赌一把,绿军
2020-06-10 01:01:25[李亦伸专栏] Kawhi封神之作凸显字母哥四大弱点:投篮不
2020-06-10 01:01:25[李亦伸专栏] Kawhi转战LA?Leonard的「要胁策
2020-06-10 01:01:26[李亦伸专栏] KD伤后勇士夺冠大门关一半,浪花兄弟需改变,
2020-06-10 01:01:26[李亦伸专栏] KD只是像Kobe的进攻武器,他们离「合格领
2020-06-10 01:01:30[李亦伸专栏] KD没有犯规!裁判报告很无聊,LBJ必须完成
2020-06-10 01:01:30[李亦伸专栏] KI去湖人吧!波士顿三核心打坏一手好牌Irv
2020-06-10 01:01:36[李亦伸专栏] KI才是东冠解答!Irving将完美顶替IT
2020-06-10 01:01:36