2011-03-24 104 views
13

我有一個應用程序,我想要有一個「背景」視圖(視圖控制器視圖),最重要的是,多個UIView s自己繪製爲圓形。我只是不明白如何實現所有這一切,同時仍然堅持MVC ...瞭解模型 - 視圖 - 控制器

模型和視圖應該是不同的。這是否意味着我通常需要一組視圖的頭文件和實現文件以及另一個(單獨的)模型集 - 即使我的對象只是一個Circle類?或者,我是否有一個Circle.hCircle.m集合,然後在頭文件中有兩個接口塊,一個用於模型,另一個用於視圖,以及兩個實現塊(同樣,一個用於模型,另一個用於視圖)?

我見過一些人推薦使用視圖控制器來處理loadView中的所有視圖,並避免創建單獨的自定義視圖對象;這是否意味着我不應該爲視圖創建單獨的一組.h.m文件?後者在設計方面似乎比我更有組織性。另外,如果我有多個視圖對象和由視圖控制器處理的多個模型對象,我會將它們存儲在控制器的兩個數組中 - 一個用於模型,另一個用於視圖。對?我的問題是:當我在每個模型上使用鍵值觀察時,對於每個模型對象,我將如何更改正確的對應視圖對象(假設兩個數組中的兩個對象的索引都不相同)?

我正在考慮使用指向視圖內部的模型對象的指針,以及從視圖到模型的KVOing--但它不會通過控制器,從而完全打破MVC,對吧?

預先感謝您。

回答

23

MVC是一個很大的概念。它不是一個具體的規則,而是一個指導性的哲學,並不總是以相同的方式實施。閱讀Apple's discussion of MVC以瞭解可可中傳統MVC和MVC之間的差異。

很難說如何將MVC應用到您的應用程序,因爲您還沒有告訴我們該應用程序應該做什麼,而且它聽起來不像一個現實的應用程序。所以我會在這裏盡我所能做出一些假設。一個只在背景上的固定位置繪製一組圓圈的應用程序並不是很有趣 - 它幾乎可以是所有視圖,幾乎不需要任何控制器。因此,我們可以說,這些圈子都在向不同的方向移動,以不同的顏色繪製,並隨着時間的推移而變化。現在您開始需要一個模型,以便您可以跟蹤這些圓圈所代表的數據,以及一個將模型轉換爲可以由視圖表示的術語的控制器。

由於您具體瞭解繪製圓圈,我們先從視圖開始。在給定必要參數的情況下,知道如何繪製圓的自定義視圖似乎是個不錯的主意:區域,顏色和位置。您可能會創建這些屬性,並重寫-drawRect:以便以給定顏色繪製給定區域的圓。

我們不知道這些圓圈代表什麼,但如果它們沒有代表什麼東西,那沒什麼好玩的,所以我們假設應用程序的工作是幫助我們比較公司。我們有關於收入,市場資本總額,員工數量,信用評級,姓名,股票代碼等的數據。您可以創建自定義對象來存儲每個公司的所有數據,也可以將它們全部放在字典中。我們的模型是一組這些自定義對象或字典。

請注意,圈子視圖並不知道關於公司的任何內容,並且該模型不知道有關圈子的任何信息。這是一件好事。這也是控制器進來的地方。控制器是您放置代碼的地方,它使用視圖直觀地表達模型。它還從視圖中解釋事件,並根據需要更新模型。因此,我們的控制人員都知道公司的具體情況以及圈子視圖的屬性。它爲模型中的每個公司創建一個循環視圖。我想要一個圈子的區域對應於公司的市值,代表收入的垂直位置和表示僱員人數的橫向位置。我們將根據公司的信用評級分配一種顏色。當然,控制者應該跟蹤所有的圈子視圖,以及在圈子視圖和公司之間進行映射的方法。

現在你已經有了一些東西。這仍然是一個非常簡單的應用程序,但是您可以在多個維度上比較公司的有用圖表。讓我們改進它。

首先,很難知道哪個圈子代表哪家公司。如果圓形視圖可以選擇顯示某些文本,那將會很好。讓我們添加標題和副標題屬性,並修改-drawRect:分別在圓上方和下方繪製這些字符串。我們還將更改控制器,以便點擊或點擊圓圈可將該圓圈的標題和副標題設置爲公司的名稱和股票代碼,或者如果之前已設置,則清除它們。其次,很高興能夠在某個時刻對公司進行比較,但如果我們能夠隨着時間的推移顯示變化,則更加有趣。讓我們改變模型以包含收入,市值,員工和評級的歷史數據。我們可以更新控制器,以便它可以使用歷史數據爲圓圈添加動畫。

第一個變化與我們如何在屏幕上繪製信息有關,並且根本不需要對模型進行任何修改。第二個變化是關於我們必須使用哪些數據,並且根本不需要對視圖進行任何更改。您可以輕鬆地重複使用圓形視圖來表示其他類型的數據,或者甚至可能是空氣曲棍球比賽中的冰球。它只是一個彩色圓圈。您可以在另一個應用程序中重新使用該模型來處理相同類型的數據。

我確信在這個非常冗長的解釋說明中,假設的應用程序與您自己的應用程序幾乎沒有相似之處,但也許它有助於解釋爲什麼MVC是有用的並告知您自己的結構應用。祝你好運。

+3

謝謝,這真的有幫助。我創建了一個擁有多個不同羣衆圈子的應用程序。我會設置一定的速度,並使用我編寫的一些物理功能來顯示球之間的動量碰撞,就像在遊戲中一樣。他們是免費的飛球相撞,就是這樣。我創建這個小應用程序的方式並沒有遵循所有的MVC。我來自一個沉重的c/c#背景,並且從未使用過MVC,所以一個例子正是我所需要的。謝謝你的例子,它確實有幫助。 – Dalisto1 2011-03-24 04:51:31

+0

太好了 - 很高興我能幫上忙。 – Caleb 2011-03-24 06:03:33

4

我從CS193P IPHONE應用程序開發(2013年冬季)得到了很好的解釋。

模型 - 視圖 - 控制器:

把所有的對象分爲三個陣營:

enter image description here

型號:什麼您的應用程序是(A卡,甲板,紙牌遊戲邏輯)
控制器:如何將模型呈現給用戶(UI邏輯)。控制器知道關於UI的所有信息。
查看:您的控制者的奴才

如何將這些營通信:

enter image description here

不要越過黃線。
你可以穿過白色虛線。
有一些特殊的規則用於穿越純白線。

enter image description here

控制器 - >查看(經由出口
查看 - >控制器(經由數據源(計數,dataAt),代表(將,應,所做的那樣), 目標 - 動作
模型 - >位指示(經由通知 & 密鑰值觀察