CS193P第六堂课摘要及心得笔记

2020-06-06 作者: 围观:867 74 评论

课程逐渐进入了中盘,不知道大家还跟的上进度吗?这次要带给大家的是第六堂课的心得笔记,还请多多指教!

第六堂课中主要谈三个重点,分别是:

  1. iPhone 程式的介面设计
  2. Model-View-Controller 的原理及方法
  3. View Controller
iPhone 程式的介面设计

iPhone 的萤幕解析度相当有限,只有 320×480 这幺大,所以以往在桌上型的软体介面并不能直接套用在 iPhone 平台,大体而言,在设计上有三大重点:

  1. 专注于使用者本身的资料
  2. 一个画面只做一件事情
  3. 而许多的的页面组成一个软体

而我们在 iPhone 软体上面,可以看到两种常见的模式,第一种是在最上方有个导览列,当我们按了画面中某个内容后,新的页面就会从左边推进来,这种模式我们称作 Navigation Bar。而另外一种模式则是在程式最下方会有许多按钮,类似像 iPhone 中的通话软体一样,每个按钮都代表着不同的页面,而这种模式叫做 Tab Bar。下面这张图片清楚的展现了两者的差别:

CS193P第六堂课摘要及心得笔记

而这样的软体设计模式,是可以被归纳成 MVC 的概念的。以通讯录软体为例,Model 所负责的资料也就是通讯录中的联络人,而 View 则是做介面上的呈现,最后 Controller 则是居中进行协调处理。

CS193P第六堂课摘要及心得笔记
Model-View-Controller 的原理及方法

之所以在 Cocoa 中採用 MVC 的设计模式,有一个很大的原因是为了能够将程式码切割,每个部份的程式码各司其职,这样可以大幅减低我们后续维护的难度。此外,当我们落实了 MVC 架构并且尽量减少类别之间的相依性,这些类别就都可以经过小幅修改而重複使用。

然而,我们要如何在减少相依性的前提下,让物件能够互相沟通呢?

在 MVC 架构中,三者其实并非互相制衡的,事实上是由 Controller 来负责整个程式的逻辑、管理物件们关係。所以一般的状况下,Controller 的程式码很少有机会能够重新使用。详细的沟通方式可以用下面这张图来说明:

CS193P第六堂课摘要及心得笔记

以 Model 而言,Model 并不会知道 View 和 Controller 的存在,一切的操作都由 Controller 来达成,所以通常 Model 也是最容易能够重新使用的。然而,当我们需要从 Model 主动传递讯息到 Controller 或是 View 的时候,则需要透过 Key-Value Observing 或是 Notification,前者会指定某特定 Key,让 Controller 能够持续观察,当这个 Key 所代表的 Value 有做修改时,Controller 就会进行对应的动作。而 Notification 则是透过 NSNotificationCenter 来进行传递。

而对于 View 来说,View 不会知道 Controller 的存在,但是有可能需要知道某些 Model 物件以便显示资料,通常也是可以经过调整而重新使用。而 View 要如何跟 Controller 沟通?则是透过我们早已熟悉的 Target-Action 模式,也就是在 Interface Builder 中将 UI 元件的 event 和 Controller 的 IBAction 进行连结。此外,透过 delegation 也是一种方式,也就是将 View 所需要的 Delegation 设定为需要沟通的 Controller,以便物件们互相沟通资讯。

View Controller

View Controller 代表是操作 View 的 Controller,除了 View Controller 之外,在下一堂课中,我们还会陆续碰到 Navigation Controller 和 Tab Bar Controller 等等,但概念上都是相同的,只是操作的方法不同。

View Controller 就如同 UIView 之于 MVC 中的 View 一般,VIewController 也就是 MVC 架构中的 Controoler 的部份,已经预先定义了许多 Controller 所需要用到的方法,当我们需要建立自己的 Controller 时,通常也会先继承 ViewController 再做修改。

在一般的程式中,我们会建立许多 ViewController 的子类别,每个子类别都将负责一个萤幕画面,而在这些类别之上,则是会使用 Cocoa 本身设计好的 Controller,像是 NavigationController,来负责整个软体的动线。

CS193P第六堂课摘要及心得笔记

那我们要建立 ViewController 的子类别时,程式的大致架构如下:

#import @interface MyViewController : UIViewController { // View Controller 通常需要同时管理 View 和 Model   NSMutableArray *myData;   IBOutlet UILabel *myLabel; } // 也需要设定 property 方便操作 @propertyNSArray *myData; // 此外也有 Action 让 UI 能够操作 - doSomeAction:sender;

而有从父类别中,我们也继承了 @propertyUIView *view; 这个 property,可以让我们设定 Controller 所对应的 View。而当 View 需要读取时,Cocoa 会自动呼叫 -loadView 这个方法,在大多数的状况,我们是不需要自己呼叫的。

而我们有两种方式能够建立 VIewController 所对应的 View,第一种是透过程式码去重载 -loadView 方法,大概的程式码如下:

- loadView {   MyView *myView = [[MyView alloc] initWithFrame:frame];   self.view = myView; // View Controller 会 retain myView   [myView release]; }

第二种作法是透过 Interface Builder 建立 nib 档来设计 View,就如同以往设计 nib 档一般,但不同的是记得要将 File's Owner 换成我们所设计的 ViewController,并且将 View Outlet 与 File's Owner 连结。当我们在程式中要建立 Controller 时,需要改呼叫:-initWithNibName:bundle: 这个方法,程式才会将正确的 nib 档读取进来。

CS193P第六堂课摘要及心得笔记

在课程影片的 [27:20] 处有第二种方法的示範,讲解的相当清楚,读者有兴趣可以参考。

View Controller 的生命週期,主要是由 View 的显示来掌控,我们有以下几个方法可以让我们重载并加入自己的程式码:

  1. - initWithNibName:nibName bundle:bundle -- View Controller 的初始化
  2. - viewDidLoad -- View 读取完毕时
  3. - viewWillAppear:animated -- View 即将要出现在萤幕时
  4. - viewWillDisappear:animated -- View 要从萤幕上被移除时

透过重载以上这些方法,我们可以在程式的进行过程中找机会存取一些资料,或是上网下载一些档案等等。

最后,View Controller 也提供了一些方法可以重载,包含像控制介面旋转的 - shouldAutorotateToInterfaceOrientation: interfaceOrientation 或是记忆体过少的处理等等,有兴趣的朋友还可以参考 Xcode 里面的文件,有详细的解说。

结论

这次的内容可以算是相当精彩,将我们以往所学的所有概念一口气统整起来,让我们对 iPhone 的开发有个全然的了解。下一次的课程内容将聚焦于 UIKit 所提供的一些 View Controller,透过这些 Controller,我们就可以将整个软体的介面流程设计出来,还请各位读者继续收看!

参考资源
相关浏览推荐