在没有managedObjectContext的视图之间传递CoreData对象

时间:2012-03-19 14:55:08

标签: iphone ios ipad core-data nsmanagedobjectcontext

请你帮我解决以下问题

我使用CoreData编写应用程序,并有两个视图控制器。

ControllerA是一个表视图,只列出数据 ControllerB是一个包含多个UITextFields

的视图控制器

要在ControllerA上编辑行,我在ControllerB上设置了一个传递我的CoreData实体模型对象的属性 例如。

viewControllerB.item = [self.fetchedResultsController objectAtIndexPath:indexPath];

编辑完成后,ViewControllerB上的项目内容将通过委托传递回ViewControllerA并保存。

这很好用,我正在努力解决的问题是在没有在ViewControllerB上设置managedObjectContext的情况下向CoreData添加新项目的最佳方法。

我尝试使用

传递新对象
ItemData *item = [NSEntityDescription insertNewObjectForEntityForName:@"ItemData" inManagedObjectContext:self.managedObjectContext];
viewControllerB.item = item;

如果我在ViewControllerB上输入带有数据的表单,这是有效的,但如果我取消视图并将其弹出,我将在CoreData中留下一个(null)对象。

我也尝试使用标准init实例化CoreData ItemData对象,但现在明白这不起作用,因为CoreData不理解上下文,也没有属性的getter / setter。

这种情况的最佳做法是什么?

1)我应该将managedObjectContext传递给viewControllerB吗? 2)创建一个模型类来保存表单中的值并将其传递回来然后处理CoreData的东西?

3)或者是否有正确的方法来做我想做的事情?

我正在松散地关注iOS Apprentice 2以处理Storyboard等,但是在这个模型类中来回传递,我知道它工作正常,它的CoreData方面就是问题所在。

我希望以上内容清楚明确,并且我使用的术语是正确的。

期待任何帮助。

1 个答案:

答案 0 :(得分:0)

  

如果我在ViewControllerB上输入带有数据的表单,这是有效的,但如果我取消视图并将其弹出,我将在CoreData中留下一个(null)对象。

如果您关闭视图,则需要删除该对象,如果您不希望它保留。因此,如果有人在您的视图中点击“中止”,则应致电

[self.managedObjectContext deleteObject:theManagedObject];

在控制器之间传递托管对象上下文有许多可能的方法。您的AppDelegate应将托管对象上下文作为属性。 如果控制器a有一个指向上下文的指针,你可以将它传递给控制器​​B的(nonatomic, weak)属性。