2012-03-01 26 views
3

我是一個新的開發人員創建一個簡單的「字典」應用程序供個人使用,我的問題是關於如何在我的特定情況下正確實現模型 - 視圖 - 控制器設計。請爲我提供必要的背景:模型 - 視圖 - 控制器在iPhone字典應用上的實踐

我希望能夠點擊按鈕並在屏幕的一側顯示一個單詞,並讓另一個標籤在另一側顯示一個關聯單詞列表側。例如:當我點擊按鈕時,我想讓主標籤顯示「貓」,併爲列表顯示「老虎」,「雪豹」,「獅子」等。輸出將是隨機的:顯示的標籤是隨機的,列表將被加密。

我已經在Xcode 4.3控制檯中通過將每個列表存儲在NSMutableArray中並使用NSDictionary來保存所有NSArrays來實現此輸出。下面是代碼:

//creates lists 
NSArray *catList = [NSArray arrayWithObjects:@"Lion", @"Snow Leopard", @"Cheetah", nil]; 
NSArray *dogList = [NSArray arrayWithObjects:@"Dachshund", @"Pitt Bull", @"Pug", nil]; 
... 
//creates dictionary and stores lists values with dictionary keys 
NSMutableDictionary *wordDictionary = [[NSMutableDictionary alloc] init]; 
[wordDictionary setObject: catList forKey:@"Cats"]; 
[wordDictionary setObject: dogList forKey:@"Dogs"]; 
... 
//randomizes selection of dictionary key 
NSInteger keyCount = [[wordDictionary allKeys] count]; 
NSInteger randomKeyIndex = arc4random() % keyCount; 
//displays selected key, which is the main word 
NSLog(@"%@", randomKey); 
//selects array list corresponding to key 
NSMutableArray *randomlySelectedArray = [wordDictionary objectForKey:randomKey]; 
//shuffles the output of the selected word list array 
for(int index = 0; index < keyCount; index++) 
      { 
       int randomIndex = arc4random() % keyCount; 
       [randomlySelectedArray exchangeObjectAtIndex:index withObjectAtIndex:randomIndex]; 
      } 
//prints word list and removes displayed dictionary selection 
NSLog(@"%@", randomlySelectedArray); 
[wordDictionary removeObjectForKey:randomKey]; 

(我需要添加代碼,不會顯示主字和列表一次一個,也許使用的NSTimer,但是這是我這麼遠。)

在Xcode中使用單視圖模板,我已經能夠通過將一些代碼添加到我的視圖控制器實現文件中的按鈕的IBAction方法中,讓模擬器顯示主詞和相應的列表。 (當然,我將NSLog更改爲initWithFormat。)但是,我的隨機代碼沒有任何工作。

最後,我的問題是如何區分事物,使其最符合MVC設計?我在想:我的按鈕和我的兩個標籤構成了視圖。我的視圖控制器是控制器,我的NSArrays和NSDictionary數據是模型。然而,我一直保留我所有的模型數據在視圖控制器內,我很確定是錯誤的。我想我需要弄清楚如何爲我的NSArrays和NSDictionary創建一個類來存儲我的模型數據。然後我必須設法讓我的按鈕&標籤通過我的視圖控制器顯示我的模型數據的所需文本。至少我認爲這就是MVC的工作原理。

我想知道如果這種理解是正確的,如果任何人有任何指示如何組織我的模型數據最有效地得到我想要的輸出。

非常感謝您的幫助!我卡住了!

回答

6

在開始設計基於MVC的應用程序之前。我們首先需要了解這些不同的組件以及MVC如何幫助我們實現? ?

爲什麼我們使用MVC(模型 - 視圖 - 控制器) 因爲它有助於我們在:

分離responsibilites也導致可重用性

通過減少依賴,你可以把一個模型或視圖類,你已經寫和其他地方使用它的方式

覺得寫更少的代碼

在設計基於MVC的應用程序時,我們應該關注以上幾點。 讓我們把這個'詞典'應用與真實世界的詞典聯繫起來。

詞典由單詞,它們的含義,發音,例子,用法,反義詞,同義詞,索引和其他類似信息組成。 當用戶想要查找特定的單詞時,他將使用頂部邊距單詞進行快速查找。一旦他找到了正確的頁面,他會去那個詞,看看它的含義,用法或其他所需的信息。

型號部分:

讓您的應用程序,我上面描述之間有什麼借鑑類比。

在您的應用程序中,您將有一個類:'詞典',其中 將代表真實世界的詞典。本詞典由詞組 組成,其含義,發音,用法等信息。 所以我們需要一個包含'W​​ord'對象的單詞數組。 「Word」課程將提供我們希望爲特定單詞提供 的所有信息。您也可以提供您 能想到的,是屬於字典,並將它們添加到它的其他屬性。(在這裏,我們談論的內容只)

現在我們需要考慮不同的操作要在此進行字典。最基本的操作是創建一個字典並訪問它。

  1. 我們將有一個DictionaryCreator類將增加所有我們的字典將有字。所以這是另一個類 'DictionaryCreator'。或者我們可以將這個創建邏輯放在'字典' init方法中。但這將有助於這個類 啓用詞典添加詞的功能。

  2. 一旦DictionaryCreator創建一個字典,用戶將準備好使用它。所以我們需要提供用戶 可以在「Dictionary」上作爲其方法執行的不同操作。在我們的例子中,我們可以考慮用戶在控制器上,這實際上是由真實的 用戶控制的。

以上的己技巧將幫助您創建僅執行其責任心的組成部分,可以在其他應用程序中重用或擴展以備將來使用。 *永遠記得Model是MVC設計中最可重用的組件。所以,只要你對Model有疑問,就去提醒'Model must be reusable'這個詞。 (不知道的觀點或控制器)

所以我們剛剛完成了應用程序的模型部分。

查看部分:

這取決於你,你的願望接口,以提供給用戶。但讓我們再次考慮真實世界的詞典。真實世界字典的內容(信息)分佈在多個頁面上。這個視圖幫助我們在字典中查看/訪問/標記/書籤(請記住,這裏用戶執行所有操作,而不是頁面既不是字典)。頁面頂部或底部有簡單的查找單詞,底部有一些發音指導。

在你的應用程序中,你說:「我希望能夠點擊按鈕並在屏幕的一側顯示一個標籤,並讓另一個標籤在另一側顯示相關字詞列表。」

在這裏我們再次有多個選項來實現這一點,您可以使用Interface Builder創建視圖並將它們與控制器連接。但是,這個控制器和View再次緊密結合,當我們希望在其他地方使用類似的接口時,我們將無法做到這一點。因此爲了可重用性,我們將創建另一個UIView類並使用新的View XIB創建它並加載此筆尖。所以在未來,如果你需要類似的視圖,你可以輕鬆地重用(比如cocoa-touch爲我們提供了UIView,UIButton等)。

*視圖也往往是MVC中的可重用組件。 (不知道控制器,可知道相關的模型對象)

控制器部分:

現在,我們已經創建視圖和模型,但他們將如何溝通?控制者將在這方面幫助他們。控制器:

Knows about model and view objects 
The brains of the operation 
Manages relationships and data flow 
Typically app-specific, so rarely reusable 

*我從斯坦福大學講座採取的點和定義[CS193P - 講座6 iPhone應用程序開發 設計iPhone應用模型 - 視圖 - 控制器(?爲什麼和如何)視圖控制器]

更新:

最近,我所遇到的MVC另一個很好的演講。它用非常好的例子以更好的方式解釋了這個設計概念。它可以在iTunes U上找到,或者您可以直接前往Paul Hegarty的iPad and iPhone Application Development (SD)

+0

哇,謝謝你花時間寫這樣一個徹底的答案@Ravin!我非常感謝你的洞察力,我將檢查你所引用的系列講座。 – 2012-03-01 07:12:10

+0

確實如此。 @Orpheus:不要忘記接受答案,這不可能讓你得到更好的答案:) – 2012-03-01 14:07:33

相關問題