2012-03-01 36 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