關(guān)于iOS開(kāi)發(fā),我們之前重點(diǎn)分析了Cocoa框架下的單例模式、委托模式和觀(guān)察者模式,今天我們繼續(xù)和南昌APP開(kāi)發(fā)制作公司小編來(lái)學(xué)習(xí)iOS常用設(shè)計(jì)模式中的MVC模式。MVC模式是相當(dāng)古老的設(shè)計(jì)模式之一,它最早出現(xiàn)在Smalltalk語(yǔ)言中?,F(xiàn)在,很多計(jì)算機(jī)語(yǔ)言和架構(gòu)都采用了MVC模式。
4.1 MVC 模式概述
MVC模式是一種復(fù)合設(shè)計(jì)模式,由“觀(guān)察者”(Observer)模式、“策略”(Strategy)模式和“合成”(Composite)模式等組成。MVC模式由3個(gè)部分組成,如圖所示,其中這3個(gè)部分的作用如下圖所示。
MVC模式
模型。保存應(yīng)用數(shù)據(jù)的狀態(tài),回應(yīng)視圖對(duì)狀態(tài)的查詢(xún),處理應(yīng)用業(yè)務(wù)邏輯,完成應(yīng)用的功能,將狀態(tài)的變化通知視圖。
視圖。為用戶(hù)展示信息并提供接口。用戶(hù)通過(guò)視圖向控制器發(fā)出動(dòng)作請(qǐng)求,然后再向模型發(fā)出查詢(xún)狀態(tài)的申請(qǐng),而模型狀態(tài)的變化會(huì)通知給視圖。
控制器。接收用戶(hù)請(qǐng)求,根據(jù)請(qǐng)求更新模型。另外,控制器還會(huì)更新所選擇的視圖并將其作為對(duì)用戶(hù)請(qǐng)求的回應(yīng)??刂破魇且晥D和模型的媒介,可以降低視圖與模型的耦合度,使視圖和模型的權(quán)責(zé)更加清晰,從而提高開(kāi)發(fā)效率。
對(duì)應(yīng)于哲學(xué)中的“內(nèi)容”與“形式”,在MVC模型中,模型是“內(nèi)容”,它存儲(chǔ)了視圖所需要的數(shù)據(jù),視圖是“形式”,是外部表現(xiàn)方式,而控制器是它們的媒介。
4.2 Cocoa Touch 中的 MVC 模式
我們討論的是通用的MVC模式,而Cocoa和Cocoa Touch框架中的MVC模式與傳統(tǒng)的MVC模式略有不同,前者的模型與視圖不能進(jìn)行任何通信,所有的通信都是通過(guò)控制器完成的,如圖所示。
Cocoa Touch的MVC模式
在Cocoa Touch框架的UIKit框架中, UIViewController 是所有控制器的根類(lèi),如 UITableViewController 、UITabBarController 和 UINavigationController 。 UIView 是視圖和控件的根類(lèi),模型一般繼承于 NSObject 的子類(lèi)。
下面我們通過(guò)一個(gè)iOS的案例來(lái)分析Cocoa Touch中MVC模式的運(yùn)作過(guò)程,這個(gè)案例的界面如圖所示。
MVC案例界面
這里我們就不過(guò)多介紹案例的編寫(xiě)過(guò)程,而是直接看一下代碼。打開(kāi)MVCSample工程,其中包括 AppDelegate類(lèi)、ViewController 類(lèi)和Main.storyboard等文件。
AppDelegate 是應(yīng)用程序委托對(duì)象, ViewController 是視圖控制器,Main.storyboard是故事板文件。我們只看到了視圖控制器,沒(méi)有看到視圖和模型。打開(kāi)故事板文件,可以看到View Controller Scene如圖所示。
View Controller Scene
打開(kāi)View Controller,就可以看到View,其中直接使用了UIKit框架中的UIView,因此在MVCSample組中沒(méi)有視圖。此外,屬于視圖的還有Button和Text Field,它們是View的子視圖。
那么,模型對(duì)象在哪兒呢?模型對(duì)象很特殊,其本質(zhì)是視圖的“數(shù)據(jù)”。Text Field輸入的內(nèi)容,Button上的標(biāo)簽,都可以說(shuō)是模型,但是模型與視圖一樣,有的時(shí)候我們未必需要自己創(chuàng)建一個(gè)模型類(lèi)。因此,我們做開(kāi)發(fā)工作時(shí),主要是編寫(xiě)視圖控制器。下面我們看看視圖控制器 ViewController 的代碼:
由上述代碼可見(jiàn),我們?yōu)閮蓚€(gè)控件myButton和myTextField定義了兩個(gè)輸出口類(lèi)型的屬性。因?yàn)橐ㄟ^(guò)控制器更新這些視圖(控件也屬于視圖),所以我們需要把這些視圖定義成輸出口類(lèi)型的屬性。
此外,還定義了 myAction: 方法以響應(yīng)myButton按鈕的觸摸事件。該方法的返回類(lèi)型是動(dòng)作事件,這說(shuō)明該方法是可以響應(yīng)控件事件的。
另外,還實(shí)現(xiàn)了 UITextFieldDelegate 協(xié)議,這樣ViewController 就變成了UITextField控件的委托對(duì)象,它們之間的運(yùn)作關(guān)系如圖所示。
MVC案例運(yùn)作圖
如圖所示,視圖包含了myButton和myTextField兩個(gè)控件?,F(xiàn)在我們按照編號(hào)對(duì)圖解釋如下。
① 當(dāng)用戶(hù)觸摸myButton的時(shí)候,會(huì)觸發(fā) ViewController 中的 myAction: 方法。
② 視圖控制器會(huì)實(shí)現(xiàn)一些控件委托和數(shù)據(jù)源協(xié)議,這要看具體的控件。在此案例中, ViewController 實(shí)現(xiàn)了UITextFieldDelegate 協(xié)議,UITextFieldDelegate 中定義了一些響應(yīng) UITextField 事件的方法。
③ 視圖控制器通過(guò)屬性 myButton 和 myTextField 來(lái)改變控件的狀態(tài)。
④ 模型對(duì)象可以通過(guò)通知機(jī)制來(lái)通知數(shù)據(jù)的變化。
⑤ 視圖控制器可以保存一個(gè)模型成員變量或?qū)傩裕⑼ㄟ^(guò)它們改變模型的狀態(tài)。
本文僅限內(nèi)部技術(shù)人員學(xué)習(xí)交流,不得作于其他商業(yè)用途。希望此文對(duì)廣大技人員有所幫助。文章出自:南昌APP開(kāi)發(fā)制作公司-百恒網(wǎng)絡(luò)