[CS193P] 第四堂課摘要及心得筆記

在歷經前面幾堂課的洗禮,相信各位讀者一定已經對Obj-C有個深刻的體驗。接下來在這堂課中,我們將進一步的前進到iPhone的程式運作以及MVC的架構,你準備好了嗎?
評論
評論

在歷經前面幾堂課的洗禮,相信各位讀者一定已經對 Obj-C 有個深刻的體驗。接下來在這堂課中,我們將進一步的前進到 iPhone 的程式運作以及 MVC 的架構,你準備好了嗎?

iPhone 程式運作週期

在一般正常可以運作的 iPhone 程式當中,通常會包含以下四個部份:

  • 編譯過的程式碼,包含 framework 的程式以及自己所撰寫的部份
  • Nib 檔案,包含了 UI 元素和物件以及物件的關聯
  • 相關資源,像是圖片、音效等等
  • info.plist 檔案,裡面有關於這個程式的相關資訊

而一個程式的生命週期又可以分成五個階段,分別是:

  1. 啟動程式
  2. 初始化程式
  3. 讀取 main nib
  4. 等候 event
  5. 處理 event,然後回到 4
  6. 離開程式

UIKit Framework

我們在前面幾次的筆記中曾經屢次談到 UIKit Framework 在 iPhone 開發上扮演著很重要的功能,它不僅提供了基本的 UI 元素,也幫助了我們解決了許多問題。

UIKit 也幫助我們啟動應用程式,所有的應用程式都會有一個單獨的 UIApplication 物件,這個物件會幫助我們協調處理上面所提到的物件的各個階段,也會幫我們分配 event、管理狀態列和程式在主畫面上的數字顯示。

不過為了使用這個 UIApplication 這個類別,我們並不會產生一個子物件去繼承 UIApplication,我們使用的是 delegation 的概念。所謂的 delegate 就是委派的意思。也就是當我們要使用 UIApplication 及許多其他的 UIKit 類別時,我們並不會繼承這個複雜的類別,而是用一個類別去包含這些物件變數。

誠如我們上面談的,因為 UIApplication 是每個 iPhone 軟體必備的,所以在 Xcode 建立專案的同時,他就會幫我們建立起一組 UIApplication 的 Delegate,並且讓我們可以自行實做一些 UIApplication 會呼叫的方法,像是:

- (void)applicationDidFinishLaunching:(UIApplication *)application; - (void)applicationWillTerminate:(UIApplication *)application; - (void)applicationWillResignActive:(UIApplication *)application; - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url; - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application;

這些方法包含了當然程式結束、或是記憶體過低等狀況時,所需要做的一些處理。

Info.plist

在這個檔案中,他記載了:

  • Icon 的樣子
  • 狀態列的樣式(正常、黑色、隱藏)
  • 應用程式的方向
  • 是否使用 Wifi 網路
  • 系統需求

要修改這些內容,在 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 檔被讀取的同時完成。

然而,我們可以透過實做- (void)awakeFromNib 這個方法,讓程式在讀取完 Nib 檔後進行一些客制化的操作,像是把程式恢復到上次關閉的狀態、或是自動開啟最後一隻檔案等等。

Target-Action

每個 View 的物件可能會發生很多不同種的事件(event),像是有:

  • 觸碰事件
    • touchDown
    • touchDragged
    • touchUp
  • 值的改變
  • 編輯事件
    • 開始編輯
    • 編輯中
    • 編輯結束

當一個事件發生時,iPhone 程式會自動呼叫目標 (target) 物件的相對應動作 (action),而這個物件就是 MVC 架構中的 controller。在課程投影片的第 42 張有很詳細的圖解,如果有不清楚的部份,可以提供參考。

至於我們要如何設定這些 event 和 target 還有 action 的關係呢?我們可以在 Interface Builder 上透過簡單的拖曳就可以完成設定,並不需要自己慢慢去撰寫物件的關聯性。

而 event 所要呼叫的 action,有三種不同的形式,都可以使用:

- (void)actionMethod; - (void)actionMethod:(id)sender; - (void)actionMethod:(id)sender withEvent:(UIEvent *)event;

最後面一種,其傳入的 UIEvent 物件會詳細紀錄關於事件發生的一些細節,如果需要一些比較細微的處理,就很適合最後一種的形式。

值得注意的是,在 iPhone 平台上,一個事件可以同時觸發多個不同的 action,跟 Mac 上的開發環境有所不同。

結論

在這次的心得筆記連載中,我們針對了 UIKit 跟 MVC 架構做了粗淺的介紹,也學習了關於 Nib 檔的知識以及如何將 View 連結到 Controller 上。在下一次的連載當中,我們將會先就第二次的作業進行討論,以及講解一些作業中困難的部份,還請大家繼續收看!

參考資源