我是一名新开发人员,创建一个供个人使用的简单“词典”应用程序,我的问题是如何在我的特定情况下正确实现模型 - 视图 - 控制器设计。请耐心等待我的背景:
我希望能够点击一个按钮并在屏幕的一侧显示一个标签,并让另一个标签显示另一侧的相关字词列表。
例如:当我按下按钮时,我希望主标签显示“猫”,列表显示“老虎”,“雪豹”,“狮子”等。输出将是随机的:标签显示将是随机的,列表将被加扰。
我已经在Xcode 4.3控制台中通过将每个列表存储在NSMutableArray中并使用NSDictionary来保存所有NSArray来实现此输出。这是代码:
//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创建一个类来存储我的模型数据。然后我必须设法得到我的按钮&amp;标签,通过我的视图控制器显示我的模型数据的所需文本。至少我认为这就是MVC的工作原理。
我想知道这种理解是否正确,是否有人对如何最有效地组织我的模型数据有任何指示,以获得我想要的输出。
非常感谢您的帮助!我被卡住了!
答案 0 :(得分:6)
在开始设计基于MVC的应用程序之前。我们首先需要知道这些不同的组件是什么以及MVC帮助我们实现的目标是什么?
为什么我们使用MVC?(模型 - 视图 - 控制器) 因为它有助于我们:
分离责任也会导致可重用性
通过最小化依赖关系,您可以获取已编写的模型或视图类并在其他地方使用
想一想编写更少代码的方法
在设计基于MVC的应用程序时,我们应该关注以上几点。 让我们将这个'Dictionary'应用程序与真实世界字典联系起来。
字典由单词,其含义,发音,例子,用法,反义词,同义词,索引和其他类似信息组成。 当用户想要查找特定单词时,他将使用上边距单词进行快速查找。一旦找到正确的页面,他就会转到该单词,并查看其含义,用法或其他所需信息。
模型部分:
让我们在你的应用程序和我上面描述的内容之间进行类比。
在你的应用程序中,你将有一个类:'Dictionary' 将代表真实世界的字典。这本词典是由 单词,其含义,发音,用法和其他信息。 所以我们需要一个包含'Word'对象的单词数组。 “Word”课程将包含我们希望提供的所有信息 特别的话。您还可以提供其他属性 可以认为这属于Dictionary并将它们添加到它。(这里我们只讨论内容)
现在我们需要考虑在这本词典上执行不同的操作。最基本的操作是创建字典并访问它。
我们将有一个DictionaryCreator类,它将添加我们的字典将拥有的所有单词。所以这是另一堂课 'DictionaryCreator'。或者我们可以将这个创建逻辑放在'Dictionary'中 init方法。但是这将是有用的 启用词典附加词功能。
- 醇>
一旦DictionaryCreator创建了一个字典,用户就可以使用它了。因此我们需要为用户提供不同的操作 可以在'Dictionary'上执行它的方法。在我们的例子中我们可以 考虑用户是控制器,实际上是由真实控制 用户。
上述技术将帮助您创建仅执行其责任的组件,并且可以在其他应用程序中重用或扩展以供将来使用。 *永远记住Model是MVC设计中最可重用的组件。因此,每当您对模型有疑问时,请提醒“模型必须可重用”。 (不知道视图或控制器)
所以我们刚刚完成了应用程序的Model部分。
查看部分:
这取决于您,您希望向用户提供哪种界面。但让我们再考虑现实世界的词典。真实世界字典的内容(信息)分布在多个页面上。这个视图可以帮助我们在字典中查看/访问/标记/书签。(请记住,这里用户执行所有操作,而不是页面和字典)。页面顶部或底部有简单的查找单词,底部有一些发音指导。
在您的应用程序中,您说“我希望能够点击一个按钮并在屏幕的一侧显示一个标签,并让另一个标签显示另一侧的相关字词列表。” / p>
这里我们再次有多个选项来实现它,您可以使用Interface Builder创建视图并将它们与您的控制器连接。但是再一次这个控制器和View将紧密耦合,当我们希望在其他地方使用类似的接口时,我们将无法这样做。因此,为了可重用,我们将创建另一个UIView类,并使用新的View XIB创建它并加载此nib。因此,将来如果你需要类似的视图,你可以轻松地重用(比如cocoa-touch为我们提供了UIView,UIButton等)。
* View也往往是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)进行第一次讲座。