添加到arrayController,编辑Core Data属性

时间:2009-05-27 20:37:58

标签: objective-c cocoa

*****编辑***** 我不确定的是如何从代码中的模型访问实体,以及如何访问该代码中的实体的特定实例。这总结了我遇到的主要问题。

*****结束编辑*****

我有一个带有要添加的按钮的tableview。单击该按钮时,将向用户显示一个打开的对话框,用于选择文件。新的Object将添加到阵列控制器中。我不知道该怎么做是编辑这个新对象的核心数据属性。有两个属性,filename和pathname,我不知道如何编辑它们。如果你看一下openPanelDidEnd:returnCode:contextInfo:函数的底部,你会看到我想要完成的事情。

- (IBAction)addAttachment:(id)sender
{
    panel = [NSOpenPanel openPanel];
    [panel beginSheetForDirectory:nil
                 file:nil
              modalForWindow:[NSApp mainWindow]
            modalDelegate:self
             didEndSelector:@selector(openPanelDidEnd:
                            returnCode:
                            contextInfo:)
              contextInfo:NULL];
}

- (void)openPanelDidEnd:(NSOpenPanel *)openPanel
             returnCode:(int)returnCode
             contextInfo:(void *)x
{
    if (returnCode == NSOKButton)
    {
        NSArray *files = [openPanel filenames];

        int i;
        for (i = 0; i < [files count]; i++)
        {
            NSString *file = [files objectAtIndex:i];
            [attachmentController add:x];
            // How do I add filenames here?
            // I'm assuming it involves KVC like
            // [something setValue:@"file" forKey:@"filename"];
            // But I don't know hot to get the something
            // i.e. since I have multiple attachments,
            // how do I get the one I just created
        }
    }
}

***********编辑************** 简化,我的模型有2个实体:附件和项目。 Item与Attachment具有to-many关系,因为每个Item可能有很多Attachment。

我的openPanelDidEnd:returnCode:contextInfo:方法现在看起来像这样:

        NSString *filename = [files objectAtIndex:i];
        MySchoolPlanner_AppDelegate *myAppDelegate = [[MySchoolPlanner_AppDelegate init] alloc];
        [NSEntityDescription insertNewObjectForEntityForName:@"Attachment"
                                      inManagedObjectContext:[myAppDelegate managedObjectContext]];
        [myAppDelegate release];

由于某种原因,绑定到Attachment数组控制器的表视图不会添加任何内容。此外,我不知道如何访问我刚创建的附件以使用KVC。

1 个答案:

答案 0 :(得分:2)

当你有一个可以在没有任何初始化的情况下创建和使用的核心数据实体时,NSArray的add:方法就是你勾选按钮的方法。在这种情况下,只需调用NSEntityDescription的

+ (id)insertNewObjectForEntityForName:(NSString *)entityName inManagedObjectContext:(NSManagedObjectContext *)context

使用您正在使用数组控制器的托管对象上下文和相应的实体名称来在代码中创建托管对象。如果您已为实体创建了子类,则可以直接在其上设置属性,或者如果尚未使用键值编码,则可以直接使用键值编码。