我有一个NSArrayController,它连接到Core Data中的Entity。我有一个IBOutlet附加到NSArrayController,以便我可以从我的Delegate添加对象。
我正在尝试使用一些预设向NSArrayController添加一个Object。到目前为止,我已经找到了如何使用。
添加对象[cards add:sender];
这可以,但它会添加一个空白对象。当我退出应用程序时,它会将此对象保存到实体,这样当我再次希望它仍然存在时。
但是我也找到了一种方法来创建一个带有预设的新对象,但是如果像上一个方法一样,它就不会保存。
NSDictionary *addedObject = [NSDictionary dictionary];
addedObject = [NSDictionary dictionaryWithObjectsAndKeys:@"TITLE", @"title",
@"CONTENT", @"content", nil];
[cards addObject:addedObject];
有没有其他方法可以使用预设创建一个新对象但是也可以保存它?我是Core Data的新手,所以我不是百分之百的全部。也许有办法创建一个指向实际实体的指针并从那里编辑它?
答案 0 :(得分:3)
子类NSArrayController并重新实现add
函数,或者对您的实体进行子类化并重新实现awakeFromInsert
。两者都是预设对象值的可接受位置。
在NSArrayController子类化的情况下:
@implementation CardsArrayController
-(void) add:(id)sender {
NSManagedObject *newItem = [self newObject];
//do object set up here...
[self addObject:newItem];
}
@end
答案 1 :(得分:0)
无论您添加获取managedObjectContext
引用的对象并保存上下文,都会保存对象。
如果您使用的是apple提供的样板代码,则可以使用以下代码:
NSError *error;
AppDelegate *appD = [NSApp delegate];
[appD.managedObjectContext save:&error];
或者你可以致电[appD saveAction:Nil]
。这也会在保存上下文之前尝试进行编辑。
或者您可以将按钮连接到saveAction:
(它是IBAction
),以便在点击按钮时保存上下文。
编辑:此外,从阵列控制器创建的对象也不必为空。由你决定。您可以使用文本字段(或其他可编辑的ui元素)绑定到arrayController
来执行此操作。或者,您可以获取数组的content
属性来访问该对象,然后进行编辑。
或者你可以通过代码添加整个对象而根本不使用数组控制器。
有很多方法。
答案 2 :(得分:0)
再次,NSDictionary
- 不是实体实例。实体在内存中表示为NSMangedObject
(或其子类,但实际上不需要子类)的实例。
事实上,托管对象支持KVC,因此它们可以表现为某些事物的字典(setValue:forKey等),但相似性结束的地方。无法将NSDictionary插入到控制Core-Data实体的NSArrayController中。您必须使用Core-Data API
创建实体e.g。
NSManagedObject *myNewEntiry = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:self.managedObjectContext];
如果以这种方式创建实体 - 使用NSArrayController使用的相同托管对象上下文 - 它将自动(但不是立即)添加到阵列控制器的内容中。
名为NSArrayController
的{{1}} IBAction是一种便捷快捷方式,它确实创建了一个指定给-(void) add:(id)sender;
的类型(和名称)的新实体,并将其添加到控制器内容中。但实际上 - 因为它没有收到任何参数 - 它会创建一个"空白"实体。空白表示 - 使用模型中定义的默认值。
本页的第一个答案,理所当然地建议您覆盖自己的NSArrayController
子类中的add:
IBAction
,以便在将新实体插入{{1 }}'内容。
所以它看起来像:
NSArrayController
我希望这可以澄清一些内容,但是您需要阅读核心数据并浏览一些基于Core-Data应用程序的苹果示例代码。