我正在从头开始研究我的第一个cocoa应用程序,我对如何让我的模型,视图和控制器一起工作感到有些困惑。我敢肯定我只是错过了一些东西。
基本上,我的视图当前设置为向控制器返回3个值。控制器获取这些值并创建类的新实例。我希望能够将这些对象放在一个数组中,然后使用该数组。
首先:我要创建的数组......这是我的模型,对吧?如何以及在何处创建它以便控制器正确解释视图中的操作(输入值)(创建对象)然后存储在方法中?
第二:我的尝试让我与我的阵列隔离开来。我试图为数组创建一个类,但我无法从控制器访问它。我该如何解决这个问题?
最后:我几天来一直在反对代码。我在教自己,我学到了很多,但我有很多简单的问题。感谢您抽出宝贵时间提供帮助。 )
编辑:
我已经创建了Student类。 Action将值发送到控制器,控制器创建一个新实例:
- (IBAction)addNewStudentButtonPressed:(id)sender
{
Student *newStudent = [[Student alloc] initNewStudentwithName:[nameField stringValue]
andID:[idField intValue]
andLevel:[levelField stringValue]];
}
使用appDidFinishLaunching
方法创建数组:
-(void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
NSMutableArray *roster = [[NSMutableArray alloc] initWithCapacity:100];
}
现在我想将学生添加到数组中。我只是遗漏了一些明显的东西。 :(
答案 0 :(得分:0)
好的,所以你似乎主要询问谁的责任是存储模型对象的容器。这是可能导致冗长讨论的灰色区域之一,但最简单的方法是将其视为模型的一部分。这是因为,最有可能的是,您希望在某个时刻保留模型,而不是每个项目创建一个文件,您更有可能只想将整个容器流式传输到文件然后再返回。
那么,谁控制了这个?如果您有基于文档的应用程序,则NSDocument子类会执行此操作。它是一个“模型控制器”(很好地覆盖了灰色区域)。您将覆盖提供的方法来编写和读取您决定的文件格式,这可以像使用NSKeyedArchiver / NSKeyedUnarchiver读取/写入整个数组(或字典或其他容器)一样简单。文档实例保留容器,并将UI实例添加到/删除作为UI命令。
在非基于文档的应用程序中,有人需要保留此容器,因此这是架构问题。最简单的方法是将其存储到您的应用程序委托实例中,并提供从应用程序的其他部分以这种方式(访问器方法等)获取它的路径。 “更好”的解决方案是拥有一个管理学生阵列的“StudentController”对象。当你感觉更舒服时,看看Cocoa Bindings和NSArrayController。它可以简化一些使其他事情复杂化的事情,但它的设计是基本思想。但是,Sans绑定,您的StudentController对象将保存容器(数组)和句柄-addStudent:-removeStudent:以及“archive / unarchive”函数,但是您要处理它们。这样,无论容器在哪里(文件,数据库等等),您的StudentController都将成为所有学生的中央商店经理。
使用Core Data可以在基本情况下更轻松。您可以定义数据模型(名为Student的单个实体),并且可以创建/插入/编辑所有学生,而无需任何代码。 Core Data和Cocoa Bindings通过使用我上面描述的一些架构和一些我没有的架构来处理幕后的一切。
更具体的问题可以为您提供更具体的答案。 : - )
答案 1 :(得分:0)
将模型想象为您的计划正在处理的内容 - 您需要显示学生列表?然后你必须设计一个带有一堆属性的Student
类[就像我闻到你已经做过的那样]。
控制器充当用户和模型之间的桥梁,此连接是视图:您点击了视图中的按钮,并且您想要一个新的因此,要创建学生,然后将其添加到数组中。
首先,你需要一个数组:你为你的Controller提供了这样的属性/ ivar - 在这个例子中我会坚持使用ivar:
<强> AppDelegate.h 强>
@interface AppDelegate : NSObject <NSApplicationDelegate>
{
//this is the array you will deal with inside Controller methods
NSMutableArray* students;
//you probably have some IBOutlets here:
IBOutlet NSTextField* nameField;
IBOutlet NSTextField* idField;
IBOutlet NSTextField* levelField;
}
<强> AppDelegate.m 强>
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
students = [[NSMutableArray alloc] initWithCapacity:100];
}
- (IBAction)addNewStudentButtonPressed:(id)sender
{
Student *newStudent = [[Student alloc] initNewStudentwithName:[nameField stringValue]
andID:[idField intValue]
andLevel:[levelField stringValue]];
//now you add the student to the array
[students addObject: newStudent]
}
数组是逻辑的一部分,但不属于模型本身 - 它现在只是一个控制器基本字段。当然,如果您使用学生列表定义Classroom
类,则将数组包装在另一个实体中。
无论如何,MVC的问题非常松散,并且有很多实现 - 不要让它超过你,只是让模式帮助你分离关注点并使开发更顺畅,但不要把它看作是教条