如果它是子视图控制器,如何将AppDelegate中的managedObjectContext传递给右视图控制器?

时间:2013-12-15 04:58:04

标签: ios objective-c core-data nsfetchedresultscontroller nsmanagedobject

我有一个子视图控制器,需要在其上设置managedObjectContext才能正常运行,虽然我考虑使用单例this question似乎强烈指出它应该传递,从AppDelegate开始。

我不知道如何将它传递给子视图控制器(请注意,它是通过Storyboard设置的)。我尝试了几种方法:

  1. prepareForSegue中,在调用embed segue之前,我将包含视图控制器中的目标视图控制器的引用保存为属性,然后尝试访问此属性,但在didFinishLaunching中segue显然还没有成立。
  2. 访问包含视图控制器的childViewControllers属性,但是再次在didFinishLaunching处填充此内容。
  3. 尽管核心数据模板和示例似乎表明应该在managedObjectContext中设置didFinishLaunching其他视图控制器,但我认为没办法。

    如何将managedObjectContext正确传递到需要它的视图控制器上?

3 个答案:

答案 0 :(得分:0)

将NSManagedObjectContext属性添加到根控制器的公共API,然后在didFinishLaunching中将其设置为应用程序委托的托管对象。然后,您可以使用根视图控制器中的上下文将其传递给后续视图控制器。在didFinishLaunching中:

MyRootViewController *controller = (MyRootViewController *)self.window.rootViewController;
controller.context = self.managedObjectContext;

您现在在根视图控制器中有一个managedObjectContext,它可以在prepareForSegue方法中传递给子视图控制器(子视图控制器必须具有一个公共的managedObjectContext属性,您可以在prepareForSegue方法中访问该属性)。 / p>

答案 1 :(得分:0)

如果在AppDelegate中设置了NSManagedObjectContext,则不传递它;相反,你创建了它的引用:

AppDelegate *appDel = [UIApplication sharedApplication].delegate;   
NSManagedObjectContext *context = appDel.managedObjectContext;

您引用它的对象类型无关紧要。

答案 2 :(得分:-1)

关于是否拥有单一的,全球可访问的对象,无论是作为AppDelegate上的财产还是作为静态可访问的Singleton的辩论,在很大程度上都是一场宗教辩论。没有正确或错误的答案,无论哪种方式都有利弊。做最简单,最自然的事情。 通常,managedObjectContext是事实上的单例:应用程序只有一个,并且在需要时随处可用。您倾向于使用单例或始终从AppDelegate访问它可能是要走的路。否则,要回答您的问题,请在推送视图控制器之前将其设置为要转换到的视图控制器上的属性,或者如您所述在prepareForSegue中将其设置为。要启动该过程,根视图控制器可以实例化它,也可以使用initloadViewviewDidLoad方法从AppDelegate访问它,并保留对它的引用。 对我来说,决定归结为几个月或几年后,当我阅读代码以及我想要维护哪种方法时,哪种方法更为明显。