- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是一名新开发人员,正在创建一个供个人使用的简单“字典”应用程序,我的问题是如何在我的特定情况下正确实现模型- View - Controller 设计。请耐心等待我了解必要的背景:
我希望能够点击按钮并让标签在屏幕的一侧显示单词,并让另一个标签在另一侧显示相关单词的列表。
例如:当我点击按钮时,我希望主标签显示“猫”,列表显示“老虎”、“雪豹”、“狮子”等。输出将是随机的:标签显示的内容将是随机的,并且列表将是困惑的。
我通过将每个列表存储在 NSMutableArray 中,并使用 NSDictionary 保存所有 NSArray,在 Xcode 4.3 控制台中实现了此输出。这是代码:
//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 中的单 View 模板,通过将一些代码添加到我的 View Controller 实现文件中按钮的 IBAction 方法中,我已经能够让模拟器显示主要单词和相应的列表。 (当然,我将 NSLog 更改为 initWithFormat。)但是,我的随机化代码都不起作用。
最后,我的问题是如何分离事物以使它们最符合 MVC 设计?我在想:我的按钮和我的两个标签构成了 View 。我的 View Controller 是 Controller ,我的 NSArrays 和 NSDictionary 数据是模型。
但是,我一直将所有模型数据保存在 View Controller 中,我很确定这是错误的。我认为我需要弄清楚如何为我的 NSArrays 和 NSDictionary 创建一个类来存储我的模型数据。然后我必须设法让按钮和标签通过 View Controller 显示模型数据所需的文本。至少我认为这就是 MVC 的工作原理。
我想知道这种理解是否正确,以及是否有人对如何最有效地组织我的模型数据以获得我想要的输出有任何指示。
非常感谢您的帮助!我被困住了!
最佳答案
在开始设计基于MVC的应用程序之前。我们首先要知道这些不同的组件是什么以及MVC帮助我们实现什么?
为什么我们使用MVC?(模型- View - Controller )因为它可以帮助我们:
Separating responsibilites also leads to reusability
By minimizing dependencies, you can take a model or view class you’ve already written and use it elsewhere
Think of ways to write less code
在设计基于MVC的应用程序时,我们应该关注以上几点。让我们将这个“词典”应用程序与现实世界的词典联系起来。
字典由单词及其含义、发音、例句、用法、反义词、同义词、索引和其他类似信息组成。当用户想要查找特定单词时,他将使用顶部边缘单词进行快速查找。一旦找到正确的页面,他就会转到该单词并查看其含义、用法或其他所需信息。
模型部分:
让我们在您的应用程序和我上面描述的内容之间进行类比。
In your application you will be having a class : 'Dictionary' which will represent the real world dictionary. This dictionary is composed of words, their meaning, pronunciation, usage and other information. So we will need an array of words which will contain 'Word' object. The 'Word' class will have all the information that we wish to provide for particular word. You can also provide other attributes that you can think of that belongs to Dictionary and add them to it.(Here we are talking about content only)
现在我们需要考虑对该字典执行不同的操作。最基本的操作是创建字典并访问它。
We will have a DictionaryCreator class which will add all the words that our dictionary will have. So this is another class 'DictionaryCreator'. Or we can put this creating logic in 'Dictionary' init methods. But it will be helpful to have this class this will enable the dictionary add-word features.
Once DictionaryCreator creates a dictionary, User will be ready to use it. So we will need to provide different operations that a user can perform on 'Dictionary' as its methods. In our case we can consider user is over controller, which in fact is controlled by real user.
上述技术将帮助您创建一个仅执行其职责的组件,并且可以在其他应用程序中重用或扩展以供将来使用。*永远记住模型是 MVC 设计中最可重用的组件。因此,每当您对模型有疑问时,请提醒“模型必须可重用”这句话。(不知道 View 或 Controller )
我们刚刚完成了应用程序的模型部分。
查看部分:
这取决于您希望向用户提供什么界面。但让我们再次考虑一下现实世界的字典。现实世界词典的内容(信息)分布在多个页面上。这个 View 帮助我们在字典中查看/访问/标记/书签。(请记住,这里用户执行所有操作,而不是页面或字典)。这些页面的顶部或底部有简单的单词查找,底部有一些发音指导。
在您的应用程序中,您说“我希望能够点击按钮并让标签在屏幕的一侧显示单词,并让另一个标签在另一侧显示相关单词的列表。”
这里我们再次有多个选项来实现这一点,您可以使用 Interface Builder 创建 View 并将它们与您的 Controller 连接。但话又说回来,这个 Controller 和 View 将紧密耦合,当我们希望在其他地方使用类似的界面时,我们将无法这样做。因此,为了可重用性,我们将创建另一个 UIView 类,并使用新的 View XIB 创建它并加载此 Nib 。因此,将来如果您需要类似类型的 View ,您可以轻松重用(例如 cocoa-touch 为我们提供了 UIView、UIButton 等)。
*View 也往往是 MVC 中的可重用组件。(不知道 Controller ,可能知道相关的模型对象)
Controller 部分:
现在我们已经创建了 View 和模型,但是它们将如何通信? Controller 将在这方面帮助他们。 Controller :
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 应用程序模型- View - Controller (为什么以及如何?) View Controller ]
更新:
最近,我又看到了一篇关于 MVC 的很好的讲座。它通过非常好的例子以更好的方式解释了这个设计概念。可以在iTunes U上下载或者直接调用iPad and iPhone Application Development (SD)进入第一讲作者:保罗·赫加蒂。
关于iphone - iPhone 词典应用程序上的模型- View - Controller 实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9510404/
我正在尝试这样做: var myBeacons: [NSUUID: [Int]] = [NSUUID(UUIDString:"74278BDA-B644-4520-8F0C-720EAF059935"
我的字典有问题。如果我将一个对象添加到字典中,它会用添加的项目覆盖整个包含项目。 添加所有元素后,Dictionary 包含正确数量的项目,但项目都是最后添加的项目。 For Each shp In
我使用字典,我将有大约一百万个条目,我将定期添加、删除、编辑和轮询..我想知道所有条目的上/下边是什么,如果有一种更高效的方式。 最佳答案 这取决于你想做什么。如果您想要一个具有快速插入、查找和删除功
我在 Swift 类中的字典数组方面遇到问题。我的代码无法在类或结构中运行,但可以在外部运行。 var data = [Dictionary]() data.append([123: "test"])
有没有一种方法可以添加注释来记录 Dictionary 或 ConcurrentDictionary 以了解键/值的含义? 例如: Dictionary _users; 这个例子有一个用户字典。 gu
我正在基于 Android AOSP LatinIME 项目创建自己的输入法应用。我设法找到了一些用于自动更正和预测的字典文件(main_en.dict、main_fr.dict 等)。 但对于许多其
我已经通过 Locale::Maketext 使我的网站支持多种语言(或更具体地说是 CatalystX::I18N::Model::Maketext )。 我的 maketext 类在编译时通过从数
我不会说英语,而且我的英语也不是很好。我自以为是。我没有和其他人一起在一个共同的代码库上工作过。我没有任何编程的 friend 。我不与其他程序员一起工作(至少没有人关心这些事情)。 我想这可能解释了
我需要做 currentKey+1。所以我想找到键值的索引并获取下一个键(如果在末尾则为第一个)。我如何找到 key 的当前索引? 我正在使用 Dictionary我用 Linq 查找 .Find 或
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 9 年前。 Improve t
我使用 python 2.7 中的 shelve 模块保存了一个数据文件,该文件不知何故已损坏。我可以用 db = shelve.open('file.db') 加载它,但是当我调用 len(db)
我想试试这个抽认卡的想法,为即将到来的测试尝试学习关键字及其含义。我想在 python 上创建一个字典,我可以用它来帮助解决这个问题。这个想法是向我显示定义,然后我必须猜测已定义的词。我在下面展示了如
当尝试 .format() 一次列表中的多个词典时,控制台会给我一个 AttributeError:'list' object has no attribute 'items'。 我尝试滚动浏览提示的
我在公共(public)类(class)中有一个公共(public)词典如下: namespace ApiAssembly { public static class TypeStore
我需要做 currentKey+1。所以我想找到键值的索引并获取下一个键(如果在末尾则为第一个)。我如何找到 key 的当前索引? 我正在使用 Dictionary我用 Linq 查找 .Find 或
我的字典总是零,想了解为什么会这样。我的代码: var dic = [NSDate : MCACalendar]?() dic?[currentDate!] = calendar 最佳答案 @Kirs
给定(简化描述) 我们的一项服务在内存中有很多实例。大约 85% 是独一无二的。我们需要对这些项目进行非常快速的基于键的访问,因为它们在单个堆栈/调用中被非常频繁查询。这个单一上下文的性能得到了极大的
我想为“Sinhala Language speech recognition”僧伽罗语建立新的声学模型、新词典、新语言模型字符是基于 Unicode 的。例如 A=අ,I=ඉ,U=උ,KA=ක,BA
我需要一个带有 的正面和负面词的列表重量 根据单词的强度和周数分配单词。我有 : 1.) WordNet - 它为每个单词提供 + 或 - 分数。 2.) SentiWordNet - 在 [0,1]
我有一个 Jinja2 字典,我想要一个可以修改它的表达式 - 通过更改其内容或与另一个字典合并。 >>> import jinja2 >>> e = jinja2.Environment() 修改字
我是一名优秀的程序员,十分优秀!