1、MVC(Model-View-Controller,模型-視圖-控制器)模式是相當古老的設計模式之一,它最早出現在SmallTalk語言中。MVC模式是一種復合設計模式,由“觀察者”(Observer)模式、“策略”(Strategy)模式和“合成”(Composite)模式等組成。MVC模式由3個部分組成,如圖
模型:保存應用數據的狀態,回應視圖對狀態的查詢,處理應用業務邏輯,完成應用的功能,將狀態的變化通知視圖。
視圖:為用戶展示信息并提供接口。用戶通過視圖向控制器發出動作請求,然后再向模型發出查詢狀態的申請,而模型狀態的變化會通知給視圖。
控制器:接收用戶請求,根據請求更新模型。另外,控制器還會更新所選擇的視圖作為對用戶請求的回應??刂破魇且晥D和模型的媒介,可以降低視圖和模型的耦合度,使視圖和模型的權責更加清晰,從而提高開發效率。
對應哲學中的“內容”與“形式”,在MVC模型中,模式是“內容”,它存儲了視圖所需要的數據。視圖是“型式”,是外部表現方式,而控制器是它們的媒介。
2、上面我們討論的是通用的MVC模式,而Cocoa和Cocoa Touch框架中的MVC模式與傳統的MVC模式略有不同,前者的模型與視圖不能進行任何通信,所有的通信都是通過控制器完成的,如下圖。
接下來我們通過一個案例來分析Cocoa Touch中MVC模式的運作過程,案例界面如上圖(中)。
打開MVCSample工程,其中包括的文件有AppDelegate.h、AppDelegate.m、ViewController.h、ViewController.m和MainStoryboard.storyboard。
AppDelegate是應用程序委托對象,ViewController是視圖控制器,但沒有看到視圖和模型。打開故事板文件,可以看到ViewController Scene(上圖右),就能看到View,其中直接使用了UIKit框架中的UIView,因此在MVCSample組中沒有視圖,屬于視圖的還有Button和Text Field,他們是View的子視圖。那么模型對象在哪呢?模型對象很特殊,起本質是視圖的“數據”。Text Field輸入的內容,Button上的便簽,都可以說是模型,但是模型與視圖一樣,有時候我們未必需要自己創建一個模型類。因此我們做開發工作時,主要是編寫視圖控制器。下面我們看看視圖控制器ViewController.h文件的代碼:
1 @interface ViewController : UIViewController<UITextFieldDelegate>2 3 @PRoperty (weak, nonatomic) IBOutlet UIButton *myButton;4 @property (weak, nonatomic) IBOutlet UITextField *myTextField;5 - (IBAction)myAction:(id)sender;6 7 @end
可以看到,ViewController.h為兩個空間myButton和myTextField定義了兩個IBOutlet(輸出口)類型的屬性。因為要通過視圖控制器更新這些視圖(控件也屬于視圖),所以我們需要把這些視圖定義成輸出口類型的屬性。
此外,ViewController.h還定義了 - (IBAction)myAction:(id)sender; 方法以相應myButton按鈕的觸摸事件。該方法的返回類型是IBAction(動作事件),這說明該方法可以相應控制事件的。
另外,ViewController還實現了UITextFieldDelegate協議,這樣ViewController就變成了UITextField空間的委托對象,它們之間的運作關系如圖:
①當用戶觸摸myButton的時候會觸發ViewController中的 - (IBAction)myAction:(id)sender 方法。
②視圖控制器會實現一些空間委托和數據源協議,這要看具體的控件。在此案例中,ViewController實現了UITextFiledDelegate協議,其中定義了一些相應UITextField事件的方法。
③視圖控制器通過屬性myButton和myTextField來改變控件的狀態。
④模型對象可以通過通知和KVO機制來通知數據的變化。
⑤視圖控制器可以保存一個模型成員變量或屬性,并通過它們改變模型的狀態。
資料:《iOS開發指南》
新聞熱點
疑難解答