0

我有一个 NSArrayController 连接到我在核心数据中的实体。我有一个连接到 NSArrayController 的 IBOutlet,这样我就可以从我的委托中添加对象。

我正在尝试使用一些预设向 NSArrayController 添加一个对象。到目前为止,我已经找到了如何使用添加对象。

[cards add:sender];

这有效,但它添加了一个空白对象。当我退出应用程序时,它会将这个对象保存到实体中,这样当我再次希望它仍然存在时。

但我也找到了一种使用预设创建新对象的方法,但如果像最后一个方法那样保存它并不会保存。

NSDictionary *addedObject = [NSDictionary dictionary];
addedObject = [NSDictionary dictionaryWithObjectsAndKeys:@"TITLE", @"title",
@"CONTENT", @"content", nil];
[cards addObject:addedObject];

有没有其他方法可以使用预设创建一个新对象,但也可以保存它?我是 Core Data 的新手,所以我不是 100% 了解这一切。也许有一种方法可以创建指向实际实体的指针并从那里编辑它?

4

3 回答 3

3

子类化 NSArrayController 并重新实现该add函数,或者子类化您的实体并重新实现awakeFromInsert. 两者都是预设对象值的可接受位置。

在 NSArrayController 子类化的情况下:

@implementation CardsArrayController

-(void) add:(id)sender {
    NSManagedObject *newItem = [self newObject];
    //do object set up here...
    [self addObject:newItem];
}

@end
于 2013-03-11T16:39:33.930 回答
0

无论您添加获取managedObjectContext引用并保存上下文的对象的任何方式都将保存您的对象。

如果您使用的是苹果提供的样板代码,那么您可以使用以下代码:

NSError *error;
AppDelegate *appD = [NSApp delegate];
[appD.managedObjectContext save:&error];

或者你可以打电话给[appD saveAction:Nil]. 这也尝试在保存上下文之前提交编辑。

或者您可以将一个按钮连接到saveAction:(它是一个IBAction)以在单击按钮时保存上下文。

编辑:从数组控制器创建的对象也不必为空。由你决定。您可以使用来自文本字段(或其他可编辑的 ui 元素)的绑定arrayController来执行此操作。或者您可以获取content数组的属性来访问该对象,然后对其进行编辑。或者您可以通过代码添加整个对象,而根本不使用数组控制器。有很多方法。

于 2013-03-11T19:08:24.790 回答
0

同样,NSDictionary- 不是实体实例。实体在内存中表示为NSMangedObject(或其子类,但实际上不需要子类)的实例。

事实上,托管对象支持 KVC,因此对于某些事物(setValue:forKey 等),它们可能表现得像字典一样,但这就是相似性结束的地方。NSDictionary 不能插入到控制核心数据实体的 NSArrayController 中。您必须使用核心数据 API 创建实体

例如

NSManagedObject *myNewEntiry = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:self.managedObjectContext];

如果您以这种方式创建实体 - 使用 NSArrayController 使用的相同托管对象上下文 - 它将自动(但不是立即)添加到数组控制器的内容中。

命名的NSArrayControllerIBAction-(void) add:(id)sender;是一个便捷的快捷方式,它确实创建了一个指定给 的类型(和名称)的新实体NSArrayController,并将其添加到控制器内容中。但实际上——因为它不接收任何参数——它创建了一个“空白”实体。空白表示 - 具有模型中定义的默认值。

此页面中的第一个答案正确地建议您add: IBAction在自己的NSArrayController子类中覆盖 ' ,以创建和设置新实体,然后再将其插入NSArrayControllers' 内容。

所以它看起来像:

@implementation CardsArrayController

-(void) add:(id)sender {
     NSManagedObject *myNewEntity = [NSEntityDescription insertNewObjectForEntityForName:@"MyEntityName" inManagedObjectContext:self.managedObjectContext];
    //do object set up here...
    [myNewEntity setValue@"Happy Birthday" forKey:@"title"];
    [self addObject:newItem];
}

@end

我希望这能澄清一点,但您需要阅读核心数据并浏览一些基于核心数据的应用程序的苹果示例代码。

于 2015-11-11T07:46:45.753 回答