0

我正在从头开始开发我的第一个可可应用程序,我对如何让我的模型、视图和控制器一起工作有点困惑。我确定我只是错过了一些愚蠢的东西。

基本上,我的视图当前设置为向控制器返回 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];
}

现在我想将学生添加到数组中。我只是错过了一些明显的东西。:(

4

2 回答 2

0

好的,所以您似乎主要在问谁的责任是存储模型对象的容器。这是可能引起冗长讨论的灰色区域之一,但最简单的做法是将其视为模型的一部分。这是因为,您很可能希望在某个时候持久化您的模型,而不是为每个项目创建一个文件,您更有可能只想将整个容器流式传输到一个文件并再次返回。

那么,谁来控制呢?如果你有一个基于文档的应用程序,你的 NSDocument 子类就有。这是一个“模型控制器”(很好地覆盖了那个灰色区域)。您将覆盖提供的方法来写入和读取您决定的文件格式,这就像使用 NSKeyedArchiver/NSKeyedUnarchiver 读取/写入整个数组(或字典或其他容器)一样简单。文档实例保留容器,并将 Student 实例添加到您的 UI 命令中/从中删除。

在非基于文档的应用程序中,有人需要保留这个容器,所以这是一个架构问题。最简单的方法是将其存储到您的应用程序委托实例中,并提供从应用程序的其他部分以这种方式访问​​它的路径(访问器方法等)。“更好”的解决方案是拥有一个管理学生数组的“StudentController”对象。当你更舒服的时候,看看 Cocoa Bindings 和 NSArrayController。它可以简化一些事情并使其他事情复杂化,但它的设计是基本思想。但是,没有绑定,您的 StudentController 对象将保存容器(数组)并处理 -addStudent: -removeStudent: 以及“归档/取消归档”函数,但是您想处理它们。这样,您的 StudentController 就成为所有学生的中央存储管理器,

在基本情况下,使用 Core Data 使这变得更加容易。您定义您的数据模型(一个名为 Student 的单个实体),并且可以创建/插入/编辑学生,而无需任何代码。Core Data 和 Cocoa Bindings 通过使用我上面描述的一些架构和一些我没有使用的架构来处理幕后的所有事情。

更具体的问题会给你更具体的答案。:-)

于 2012-08-29T14:39:49.430 回答
0

模型视为您的程序正在处理的内容的积极表示 - 您需要显示学生列表吗?然后你必须设计一个Student具有一堆属性的类[就像我闻到你已经做过的那样]。

控制器充当用户和模型之间的桥梁,这种连接就是视图您在视图中点击一个按钮,因此您希望创建一个新学生,然后将其添加到数组中。

首先,你需要一个数组:你为你的控制器提供这样的属性/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使用学生列表定义一个班级,那么您就是将数组包装在另一个实体中。

Anyway the MVC matter is quite loose, and has many implementations - don't let it overhelm you, just let the pattern help you to separate concerns and to have a smoother development, but don't think of it as a dogma.

于 2012-08-29T14:51:03.250 回答