在没有 managedObjectContext 的视图之间传递 CoreData 对象
Posted
技术标签:
【中文标题】在没有 managedObjectContext 的视图之间传递 CoreData 对象【英文标题】:Passing CoreData objects between views without managedObjectContext 【发布时间】:2012-03-19 14:55:08 【问题描述】:您能帮我解决以下问题吗
我使用 CoreData 编写了一个应用程序,并且有两个视图控制器。
ControllerA 是一个表格视图,只列出数据 ControllerB 是一个视图控制器,包含几个 UITextFields
要在 ControllerA 上编辑一行,我在 ControllerB 上设置了一个属性,传递了我的 CoreData 实体模型对象 例如。
viewControllerB.item = [self.fetchedResultsController objectAtIndexPath:indexPath];
编辑完成后,ViewControllerB 上的 item 的内容会通过委托传回 ViewControllerA 并保存。
这很好用,我正在努力解决的问题是向 CoreData 添加新项目而不在 ViewControllerB 上设置 managedObjectContext 的最佳方法。
我尝试过传递一个新对象
ItemData *item = [NSEntityDescription insertNewObjectForEntityForName:@"ItemData" inManagedObjectContext:self.managedObjectContext];
viewControllerB.item = item;
如果我在 ViewControllerB 上输入带有数据的表单,则此方法有效,但如果我取消视图并将其弹出,我会在 CoreData 中留下一个(空)对象。
我也尝试过使用标准 init 实例化 CoreData ItemData 对象,但现在明白这行不通,因为 CoreData 不了解上下文,也没有属性的 getter/setter。
这种情况的最佳做法是什么?
1) 我应该将 managedObjectContext 传递给 viewControllerB 吗? 2) 创建一个模型类来保存表单中的值并将其传回,然后处理 CoreData 的东西?
3) 还是有正确的方法来做我想做的事情?
我松散地遵循 ios Apprentice 2 来处理 Storyboard 等,但在这个模型类中来回传递我知道它工作正常,它的 CoreData 方面就是问题所在。
我希望上述内容很清楚,并且我使用的术语是正确的。
期待任何帮助。
【问题讨论】:
【参考方案1】:如果我在 ViewControllerB 上输入带有数据的表单,则此方法有效,但如果我取消视图并将其弹出,我会在 CoreData 中留下一个(空)对象。
如果您关闭视图,如果您不希望它保留,则需要删除该对象。因此,如果有人在您的视图中“中止”,您应该致电
[self.managedObjectContext deleteObject:theManagedObject];
在控制器之间传递托管对象上下文有很多可能的方法。您的 AppDelegate 应该将托管对象上下文作为属性。
如果控制器 a 有一个指向上下文的指针,您可以将其传递给控制器 B 的 (nonatomic, weak)
属性。
【讨论】:
所以基本上我必须传递从以下 ItemData *item = [NSEntityDescription insertNewObjectForEntityForName:@"ItemData" inManagedObjectContext:self.managedObjectContext]; 创建的项目到另一个视图,如果没有做任何事情,我必须删除它。因此,如果我更改我的 didCancel 委托方法以返回 managedObject 我可以从核心数据中删除该对象 这个答案是正确的,除了需要传递上下文的部分。如果您传递的是托管对象,则它包含对上下文的引用,因此您也不需要它。删除回调方法中的对象是要走的路。以上是关于在没有 managedObjectContext 的视图之间传递 CoreData 对象的主要内容,如果未能解决你的问题,请参考以下文章
在没有 managedObjectContext 的视图之间传递 CoreData 对象
AppDelegate 类型的值没有成员 managedObjectContext
UIApplicationDelegate 在 Swift 应用程序中没有名为 managedObjectContext 的成员
RestKit:'NSInternalInconsistencyException',原因:'无法执行映射:没有分配`managedObjectContext`