在没有 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`

“AppDelegate”类型的IOS开发值没有成员“managedObjectContext”Xcode 10

有没有办法查看 managedobjectcontext 中的哪些对象尚未添加到持久存储中?