iOS中MVC等設計模式詳解 – iPhone手機開發技術文章 iPhone軟體開發教學課程


  • 在iOS編程,利用設計模式可以大大提高你的開發效率,雖然在編寫代碼之初你需要花費較大時間把各種業務邏輯封裝起來。(事實證明這是值得的!)

    模型-視圖-控制器(MVC)設計模式是被大傢廣為熟悉和使用的模式,實際上在移動開發中尤其ios開發中,這種模式被發揮到淋漓盡致

    MVC設計模式包括三個部分:模型、視圖和控制器。 這個模型包含數據、信息,邏輯,或對象被認為是部分的業務層的iOS應用。視圖包含所有的用戶信息的組件,如文本區域,按鈕,滑塊,被認為是表示層的一個iOS應用。控制器是聯絡,或通信層,一個iOS應用。一個模型將永遠不會直接溝通一個視圖,反之亦然。 控制器連接模型視圖處理所有通信。

    用戶行為發生在一個視圖,比如一個按鈕點擊。 視圖將消息發送給控制器。 如果有必要,控制器與模型。 控制器通過信息返回到視圖。 使用一個假想的計算器應用程序作為一個例子,MVC設計模式將應用如下:

    • 模型——計算功能(加、減、乘、除)。

    • 視圖——用戶界面組件(操作數和操作符按鈕、計算文本)。

    • 控制器——對象,傾聽和溝通信息模型和視圖。 當平等的按鈕被選中時,例如,控制器使請求模型執行數學。 該模型返回答案到控制器,它及時溝通結果視圖。 視圖負責顯示答案。

    • 二、簡化你的設計模式vcD4KPHA+CtTaT2JqZWN0aXZlLUPT79HUseCzzKOszO2807W9xPq1xNOm08OzzNDytcTM2Lao0NDOqrXEt73Kvdau0rvKx82ouf28zLPQoaPE+r/J0tS0tL2o0ru49s/W09DA4LXE19M/P8Dgo6zSqsO01PbHv7OswOC1xMr00NS6zdDQzqqjrLvy0tTEs9bWt73KvdDeuMTL/MPHoaO1q9Ky09DG5Mv7tcSjrLj809C77sGmtcS3vcq9zO2808zYtqjT2tOm08OzzNDytcTQ0M6qo6yyu8nmvLDX08DgoaPV4tCptq/MrLXEvLzK9brNt723qMrHu/nT2snovMbEo8q9oaPTydPa1eLGqs7E1cK94srNy7WjrNTaxOO1xLT6wuvW0LLJ08O1xMnovMbEo8q909DW+tPawOC6zb/yvNzA4LXEv8nW2NPD0NS6zb/JwKnVudDUoaM8L3A+CjxwPgo8L3A+CjxwPgo8L3A+CjxoMz4Kyei8xsSjyr2jusSjsOXM4bmptcTJ6LzGo6y94r72wcvSu7j2seCzzM7KzOI8L2gzPgo8cD4Kyei8xsSjyr3Kx8Pmz/K21M/ztcTI7bz+v6q3otLUvLDG5Mv7wezT8tbQyrnTw7Ppz/O1xLmkvt+ho9XiysfSu7j2xKOw5bXEyei8xqOsveK+9sHL0ruw48fpv/bPwqOs1NrM2Laox+m/9s/Cvq2zo7eiyfq1xM7KzOKho9LytMujrMnovMbEo8q9ysfSu9bWzNi2qLXEo6y+38zltcTJ6LzG1rjEz6O6obDKtcD9u6+hsbXExKPKvaOs1NrSu7ao0uLS5cnPoaPT0NK7tqi1xMHpu+7Q1KOsv8nS1Mjnus7TptPDyei8xsSjyr2jrMrCx+nN+c35v8nS1L72tqjI57rO06bTw7jDxKPKvaOsyOex4LPM0+/R1LrNz9bT0LzcubmhozwvcD4KPHA+Cry4uPbW98ziu/LJ6LzG07DP7MnovMbEo8q9tcTUrdTyoaPV4tCpyei8xtSt1PKjrLm5vajD5s/yttTP87XEz7XNs6OsyOfEtNa4uebU8rXEobC34tewz7XNs73hubm3vcPmtcSx5LuvobG6zaGws8zQ8rXEvdO/2qOstviyu8rH1rTQ0KGjobHL+8PHse2078HL1tjSqrXEvPu94qGjwP3I56Ost+LXsNSt1PLLtaOsyOe5+8TjtcTPtc2z09DL+bK7zayjrL2ry/zDx7fi17C49MDrtcSyv7fWo6zL+8PHv8nS1LbAwaK12LjEseTPtc2ztcTG5Mv7sr+31qOszNix8MrHyOe5+8TjzqrL+8PHtqjS5b3Tv9qjrLK70sDAtdPavt/M5cq1z9aho8T6v8nS1NTa0tS687jEseS78tHTs6TV4tCpseTBv7XEsr+31qOstviyu7vh07DP7M+1zbO1xMbky/uyv7fWoaO007b4z/uz/dLAwLW6zbz1ydnB47z+1q685LXEwarW4cb3o6zS8rTLz7XNs7HktcO4/MHpu+6jrLj8yN3S17jEseShozwvcD4KPHA+CtXi0Km6w7Smo6zI58q5yei8xsSjyr2jrNK7uPbW2NKqtcS/vMLH0vLL2KOstbHE47Hg0LTI7bz+oaPI57n7xOO3os/Wo6zP4MrK06ajrNTaxOO1xNOm08OzzNDytcTJ6LzGus3KudPDt73KvaOss8zQ8rXEttTP87rNwOCjrMv8sPzAqL2ruPy24LXEv8nW2NPD0NSjrL/JwKnVudDUo6y4/Mjd0te4xLHko6zOtMC0tcTQ6MfzyrGjrNKqx/PL/KGjtMvN4qOsu/nT2snovMbEo8q9tcTTptPDs8zQ8tK7sOOxyNOm08OzzNDyyseyu8rHuPzTxdHFus2439Cno6zS8s6qy/vDx9Do0qq4/MnZtcS0+sLrwLTN6rPJzazR+bXExL+x6qGjPC9wPgo8cD4KxOO/ydLU1dK1vcrK06bV+7j2tcRDb2NvYSBUb3VjaLrNQ29jb2G/8rzctcTJ6LzGxKPKvaOs1NpPYmplY3RpdmUtQ9TL0NC6zdPv0dSho7v509rV4tCpxKPKvbXE0rvQqbv61sajrMTju+G1w7W9vLi69crHobDD4rfRobGjrLWr0OjSqtK70Km5pNf31NrE47XE0ruyv7fWoaPE47/J0tTJ6sfrtb3X1Ly6tcTTptPDs8zQ8rXEtPrC66OstbHQzsrG0OjSqsqxy/y1xMnovMbEo8q9oaPI57n7xPrKudPDtcS1xL/Jv8m0pcP+us1Db2NvYb/yvNzKudPDz+DNrLXExKPKvaOsxOO1xLT6wuvN+c350tTKytOmuPy6w7XEv/K83LT6wuujrLKix9K5pNf3uPzTxdHFoaM8L3A+CjxwPgo8L3A+CjxwPgo8L3A+CjxoMz4K1+7W2NKqtcTJ6LzGxKPKvaO6xKPQzSCoQyDK0828IKhDIL/Y1sbG9zwvaDM+CjxwPgrEo9DNIKhDIMrTzbwgqEMgv9jWxsb3yei8xsSjyr2jrKOoy9ezxk1WQ6Opt9bF5NK7uPbTptPDs8zQ8tbQtcS21M/ztcTI/bj2vcfJq9au0rujusSj0M2jrMrTzbyjrL/Y1sbG96GjxKPKvbK7vfa2qNLl06bTw7PM0PLW0LXEttTP87Dn0d21xL3HyaujrMv8tqjS5cHLttTP87XEt73KvdPrttS3vbm1zaiho8j91tbA4NDNtcS21M/z1tC1xMO/0ru49srHtNPG5Mv7t9bA67Ppz/O1xLHfvee/59S91eLQqbHfvee1xMbky/vA4NDNtcS21M/zvfjQ0M2o0MWho9PQyrHSsrG7s8bOqtTa0ru49tOm08OzzNDy1tC1xMS/seq1xE1WQ8Dg0M21xLyvus/W0LXEttTP87XEsuOjrMD9yOejrMSj0M2y46GjPC9wPgo8cD4KPGltZyBzcmM9″/uploadfile/Collfiles/20140118/2014011809022735.png” alt=”\”>

    • MVC是一個好的設計任何iOS應用程序或Mac應用程序的核心。采用這種模式的好處是多方面的。很多在這些應用程序中的對象往往是可重復使用的,往往得到更好的界定及其接口。MVC設計的應用程序,也更容易比其他應用程序進行擴展。此外,您的應用程序可以使用的許多技術和架構是基於MVC和要求您的自定義對象扮演一個MVC的角色。

      您可能沒有意識到這一點,但你已經創建瞭一個應用程序,是基於MVC:在你的iOS應用的HelloWorld。的模型對象是用戶名物業(NSString的對象)宣派及管理HelloWorldViewController類的。的HelloWorldViewControllerHelloWorldAppDelegate類的實例應用程序的控制器對象的應用程序的視圖對象的文本字段,標簽,按鈕,背景圖。

      模型-視圖-控制器的完整信息“模型-視圖-控制器”的概念在Objective-C編程。

      模型對象

      模型對象封裝瞭一個應用程序定義的數據操作和處理數據的邏輯和計算。例如,一個模型對象可能代表一個字符,在遊戲或在地址簿中的聯系人。有時,一個應用程序的模型層實際上是一個或多個圖形相關的對象。大部分的數據,部分應用程序的持久狀態(是否持久化狀態存儲在文件或數據庫)應駐留在數據加載到應用程序的模型對象後。因為模型對象代表到一個特定的問題域相關的知識和專長,他們可以重復使用在類似的問題域。應該有一個“純粹”的模型對象的視圖對象,目前其數據,並允許用戶編輯數據,它不應該被關註的用戶界面和演示問題沒有明確的連接。

      在視圖層創建或修改數據的用戶操作在創建或更新模型對象通過一個控制器對象和結果傳達。當一個模型對象的變化(例如,新的接收數據通過網絡連接),它會通知控制器對象,更新相應的視圖對象。

      查看對象

      一個視圖對象是在一個應用程序,用戶可以看到一個對象。一個視圖對象知道如何繪制自己可能會響應用戶的操作。視圖對象的一個??主要目的是顯示數據從應用程序的模型對象,可以使編輯該數據。盡管如此,在一個MVC應用程序的視圖對象模型對象通常脫鉤。

      因為你通常重用視圖對象,對其進行重新配置,視圖對象提供應用程序之間的一致性。對於iOS上,UIKit框架提供瞭視圖類的集合;為OS X AppKit的框架提供瞭一個類似的集合。UIKit的視圖對象的UIView類;最終繼承瞭AppKit,它最終繼承自NSView的類。

      視圖對象通過應用程序的控制器對象模型數據的變化,並瞭解用戶發起的變化,例如,文本的文本字段中輸入通過控制器對象應用程序的模型對象溝通。

      控制器對象

      控制器對象作為一個或多個應用程序的視圖對象和一個或多個模型對象之間的中介。因此,控制器對象視圖對象的管道瞭解變化的模型對象,反之亦然。控制器對象也可以執行一個應用程序的安裝和協調的任務和其他對象的生命周期管理。

      控制器對象解釋用戶視圖對象中的行動和新的或更改的數據模型層。當模型對象的變化,控制器對象通信,新的模型數據的視圖對象,使他們能夠顯示它。

      設計模式解決問題

      面向對象的系統,作為一個應用程序是動態的。一個對象可以在運行時並不限定於在編譯時設置的行為。一個對象可以發送郵件到其他對象,並可以有所不同運行情況下的目標相同的消息。一個對象也可以與其他對象的一個??變量組在運行時,使用瞭多種技術,可以有效地完成工作的應用程序。對於一個對象,或對象的網絡,做到這一點,它必須利用許多技術和框架體系結構的設計模式是適應的。

      以下各節描述瞭許多這些技術和架構。考慮他們的Objective-C編程工具包的一部分。

      代表團:代理代表另一個對象

      代表團,一個對象調用代表的委托行為,並要求另一個對象。其他,委派,對象通常是一個框架對象。在一些點在執行時,它發送一個消息到其委托的消息告訴一些事件即將發生的委托,並要求一些回應。委托(通常是一個自定義類的一個實例)實現調用的方法的消息,並返回一個適當的值。通常情況下,該值是一個佈爾值,告訴委托對象是否繼續進行的動作。

    • 因此,代表團是一個框架的運作註入特定於應用程序的行為的一種手段,無需子類類類。它是一種常見的和強大的設計延伸和影響的行為框架。

      回想的HelloWorldAppDelegate對象的HelloWorld應用程序時創建工作通過你的第一個iOS應用。Xcode的自動分配,它是應用程序對象的委托,這是一個框架對象。應用程序委托可以處理應用:的didFinishLaunchingWithOptions:和其他代表團的消息發送給它的應用程序對象。

      有兩個綱領性組件代表團。委托類必須定義一個屬性(按照慣例,名為委托)委托持有的參考。它也必須聲明一個協議,必須采取委托類(請參閱下面的部分協議)。很多類的Cocoa
      Touch和Cocoa框架提供的代表團作為一種方法,應用程序與特定應用程序的東西,是可以采取增加框架的行為。

      但是,代表團並不限於框架類。您可以實現在一個應用程序的兩個自定義對象之間的代表團。在可可觸摸應用程序使用一種常見的設計代表團允許子視圖控制器進行通信其父視圖控制器的一些值(通常是用戶輸入的值)的一種手段。

      協議:啟用通信對象之間的繼承關系

      協議是一聲明的程序接口的方法,任何類都可以實現。與協議相關聯的類的實例調用的方法的協議,並獲得返回值類正式通過和實施該協議。這一個具體的目標,如解析XML的代碼或復制對象,對象之間的溝通,進一步加強。協議接口的任一側上的對象可以被遙遠地相互關聯的,通過繼承。因此協議是,代表團,子類化的替代,往往是一個框架的實施代表團的一部分。

    • 蘋果提供的框架申報幾十協議。此外,您的應用程序可以聲明你的類可以采用自定義協議。協議是你的編程工具包的一部分。與Objective-C語言編程,給出瞭一個全面的協議描述。

      通知中心:通知有關觀察員事件

      Foundation框架的通知中心是一個子系統,廣播消息通知到一個應用程序中的所有對象註冊事件的觀察員。(以編程方式,這是一個NSNotificationCenter類的實例。)事件可以發生在任何一個應用程序的應用程序進入背景狀態,例如,或用戶開始鍵入的文本字段中。一個通知,通知該事件已發生或即將發生的觀察員,從而使觀察者以適當的方式回應的機會。通知中心的廣播通知是一種方法來增加一個應用程序對象之間的合作和凝聚力。

    • 例如,在iOS應用程序的視圖控制器可以觀察的通知UIKeyboardWillShowNotification調整其視圖的幾何形狀,以適應虛擬鍵盤。這個例子表明,通知是一個對象,它有一個名字,表明一個特定的事件,該事件是否已經發生或即將發生。它還帶有一個參考對象的職位(或發送)的通知,通知中心,它可以包含一個字典的補充資料。

      任何對象都可以觀察到一個通知,但這樣做的,它必須註冊後才能收到它。在註冊時,必須指定一個選擇,確定要調用的方法的交付通知,方法的簽名必須有一個參數:通知對象。註冊時,觀察者也可以指定發佈對象。

      通知中心通知代表團消息被發送到任意對象的特定事件發生時。但是,處理通知的方法,委派方法不同,不能返回一個值。通過通知中心的通知是同步的,就像代表團。

      在您的應用程序的自定義對象可以定義和發佈自己的通知,以及其他定制的對象在你的應用程序中,可以觀察到通知。

      目標行動:當事件發生時要發送的消息封裝

      targer-action設計的概念很簡單。對象存儲的元素,使訊息表達,當某個事件發生時,把這些元素組合在一起,並發送一條消息。的元素是吞吐量的消息(action),接收該消息的對象(target)的一個選擇器。目標的類方法實現瞭相應的行動和目標,當它接收到的消息,在運行時,它響應此事件的執行方法。

      target-action主要是控制在Cocoa Touch和Cocoa框架的一個特點。控件是一個用戶界面對象,如按鈕,滑塊,或切換用戶操作(通過點擊,拖動,等等),以表示它們打算到一個應用程序。Cocoa
      Touch控制存儲的行動和目標都搭配一個或多個單元格對象存儲目標和行動,大多數Cocoa Touch。

    • 一些框架使用target-action控制以外的對象。例如,UIKit框架使用目標的行動,在其設計的手勢識別。當一個手勢識別對象識別手勢,動作消息發送到目標對象。

    • 鍵 – 值觀察:當一個值發生變化時通知觀察員

      鍵 – 值觀察允許一個對象在觀察的另一個對象的一個??屬性。觀察對象時,會通知該屬性的值的變化。瞭解新的值,以及舊的,如果觀測到的屬性是一個對多的關系(例如,一個數組),它也得知涉及其中所包含的對象中的變化。志願幫助應用程序變得更有凝聚力,保持對象模型,控制器,查看圖層的變化同步。

      類似NSNotificationCenter通知,多個志願觀察員可以觀察到一個單一的財產。此外,KVO是動態的,因為它允許觀察的對象,而不需要任何新的API,如通知名稱的任意屬性。國際志願者組織是一個輕量級的點至點的通信機制,不允許觀察的特定屬性的所有實例。

      基於設計模式的框架設計

      CocoaKIt和Cocoa框架還包括其他的設計基於設計模式,包括以下內容:

      • 查看層次結構。的意見被安排在一個應用程序提出基於視覺的層次組織遏制。這種模式允許應用對待個人的觀點和意見的成分均勻。在層次結構的根是一個窗口對象,每個視圖中,根目錄下有一個父視圖和零個或更多孩子的意見。傢長的意見附上孩子的意見。視圖層次結構中的結構成分,兩者的繪圖和事件處理。

      • 響應鏈。響應鏈是一系列的對象大多意見,也有窗口,視圖控制器,本身以及其中的應用對象可以通過事件或動作消息,直到一個鏈中的對象處理該事件。因此,它是一個合作的事件處理機制。響應鏈密切相關的視圖層次。

      • 查看控制器。雖然兩者的UIKit和AppKit的框架視圖控制器類,他們在iOS中是特別重要的。視圖控制器是一種特殊的控制器對象提出意見和管理一組。查看控制器對象提供的基礎設施管理內容相關的意見和協調它們的顯示和隱藏。視圖控制器管理子層次結構的應用程序視圖。

      • 類別為您提供一種方式來擴展一個類添加方法。與delegate一樣,它使您可以自定義行為沒有子類。分類是一個Objective-C的功能描述中寫Objective-C代碼。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *