Orp*_*ury 3 iphone model-view-controller cocoa-touch xcode4.3
我是一个新开发人员,创建一个供个人使用的简单"字典"应用程序,我的问题是如何在我的特定情况下正确实现模型 - 视图 - 控制器设计.请耐心等待我的背景:
我希望能够点击一个按钮并在屏幕的一侧显示一个标签,并让另一个标签显示另一侧的相关字词列表.
例如:当我按下按钮时,我希望主标签显示"猫",列表显示"老虎","雪豹","狮子"等.输出将是随机的:显示的标签将是随机,列表将被扰乱.
我已经在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];
Run Code Online (Sandbox Code Playgroud)
(我需要添加显示主要单词并一次列出一个主要单词的代码,可能使用NSTimer,但这是我到目前为止所做的.)
在Xcode中使用单视图模板,我已经能够通过将一些代码添加到视图控制器实现文件中按钮的IBAction方法来使模拟器显示主要单词和相应列表.(当然我将NSLog更改为initWithFormat.)但是,我的随机化代码都不起作用.
最后,我的问题是如何将事物分开以使它们最符合MVC设计?我在想:我的按钮和我的两个标签构成了视图.我的视图控制器是控制器,我的NSArrays和NSDictionary数据是模型.
但是,我一直把所有模型数据保存在视图控制器中,我很确定这是错误的.我想我需要弄清楚如何为我的NSArrays和NSDictionary创建一个类来存储我的模型数据.然后我必须设法让我的按钮和标签通过我的视图控制器显示我的模型数据的所需文本.至少我认为这就是MVC的工作方式.
我想知道这种理解是否正确,以及是否有人有关于如何最有效地组织我的模型数据以获得我想要的输出的任何指示.
非常感谢您的帮助!我被卡住了!
在开始设计基于MVC的应用程序之前.我们首先需要知道这些不同的组件是什么以及MVC帮助我们实现的目标是什么?
为什么我们使用MVC?(模型 - 视图 - 控制器)因为它可以帮助我们:
分离责任也导致可重用性
通过最小化依赖关系,您可以获取已编写的模型或视图类,并在其他地方使用它
想一想编写更少代码的方法
在设计基于MVC的应用程序时,我们应该关注以上几点.让我们将这个'Dictionary'应用程序与真实世界字典联系起来.
字典由单词,其含义,发音,例子,用法,反义词,同义词,索引和其他类似信息组成.当用户想要查找特定单词时,他将使用上边距单词进行快速查找.一旦找到正确的页面,他就会转到该单词,并查看其含义,用法或其他所需信息.
型号部分:
让我们在您的应用程序和我上面描述的内容之间进行类比.
在您的应用程序中,您将拥有一个类:"Dictionary",它将代表真实世界的词典.这本词典由单词,含义,发音,用法和其他信息组成.所以我们需要一个包含'Word'对象的单词数组."Word"类将包含我们希望为特定单词提供的所有信息.您还可以提供您可以想到的属于Dictionary的其他属性并将其添加到其中.(这里我们只讨论内容)
现在我们需要考虑在这本字典上执行不同的操作.最基本的操作是创建字典并访问它.
我们将有一个DictionaryCreator类,它将添加我们的字典将拥有的所有单词.所以这是另一个类'DictionaryCreator'.或者我们可以将这个创建逻辑放在'Dictionary'初始化方法中.但是,这个类将启用字典附加字功能将是有帮助的.
一旦DictionaryCreator创建了一个字典,用户就可以使用它了.因此,我们需要提供用户可以在"Dictionary"上执行的不同操作作为其方法.在我们的例子中,我们可以认为用户是控制器,实际上是由真实用户控制的.
上述技术将帮助您创建一个仅执行其责任的组件,并且可以在其他应用程序中重用或扩展以供将来使用.*永远记住Model是MVC设计中最可重用的组件.因此,每当您对模型有疑问时,请提醒"模型必须可重用".(不知道视图或控制器)
所以我们刚刚完成了应用程序的Model部分.
查看部分:
这取决于您,您希望向用户提供的接口.但让我们再考虑现实世界的词典.真实世界字典的内容(信息)分布在多个页面上.这个视图有助于我们在字典中查看/访问/标记/书签.(请记住,这里用户执行所有操作,而不是页面和字典).页面顶部或底部有简单的查找单词,底部有一些发音指导.
在您的应用程序中,您说"我希望能够点击按钮并在屏幕的一侧显示标签,并在另一侧显示另一个标签显示相关字词列表."
在这里,我们再次有多个选项来实现它,您可以使用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
Run Code Online (Sandbox Code Playgroud)
*我从斯坦福大学讲座中获得的观点和定义[CS193P - 第6讲iPhone应用程序开发设计iPhone应用程序模型 - 视图 - 控制器(为什么和如何?)视图控制器]
更新:
最近,我遇到了另一个关于MVC的好讲座.它通过非常好的例子以更好的方式解释了这个设计概念.它可以在iTunes U上找到,或者您可以直接通过Paul Hegarty的iPad和iPhone应用程序开发(SD)进行第一次讲座.