如果它是子视图控制器,如何将 AppDelegate 中的 managedObjectContext 传递给正确的视图控制器?
Posted
技术标签:
【中文标题】如果它是子视图控制器,如何将 AppDelegate 中的 managedObjectContext 传递给正确的视图控制器?【英文标题】:How do I pass the managedObjectContext in the AppDelegate to the right view controller if it's a child view controller? 【发布时间】:2013-12-15 04:58:04 【问题描述】:我有一个子视图控制器,需要在其上设置 managedObjectContext
才能正常运行,虽然我考虑使用单例 this question 似乎强烈指出它应该被传递,从应用代理。
但是,我不知道如何将它传递给子视图控制器(请注意,它是通过 Storyboards 设置的)。我尝试了几种方法:
-
在
prepareForSegue
中,在调用嵌入segue 之前,我将对包含视图控制器中的目标视图控制器的引用保存为属性,然后尝试访问该属性,但在didFinishLaunching
中,segue 显然没有尚未设置。
访问包含视图控制器的childViewControllers
属性,但同样,didFinishLaunching
未填充此属性。
因此,尽管 Core Data 模板和示例似乎表明其他视图控制器的 managedObjectContext
应该设置在 didFinishLaunching
中,但我认为没有办法。
如何正确地将managedObjectContext
传递给需要它的视图控制器?
【问题讨论】:
【参考方案1】:将 NSManagedObjectContext 属性添加到根控制器的公共 API,然后在 didFinishLaunching 中将其设置为应用委托的托管对象。然后,您可以使用根视图控制器中的上下文将其传递给后续视图控制器。在 didFinishLaunching 中:
MyRootViewController *controller = (MyRootViewController *)self.window.rootViewController;
controller.context = self.managedObjectContext;
您现在在根视图控制器中有一个 managedObjectContext,可以在 prepareForSegue 方法中传递给子视图控制器(子视图控制器还必须有一个公共 managedObjectContext 属性,您可以在 prepareForSegue 方法中访问它)。
【讨论】:
【参考方案2】:关于是否拥有一个单一的、全局可访问的对象(作为 AppDelegate 上的属性或作为静态可访问的 Singleton)的争论主要是一场宗教争论。没有正确或错误的答案,无论哪种方式都有利弊。做对你来说最简单、最自然的事情。
通常,managedObjectContext 是一个事实上的单例:只有一个用于应用程序,并且在需要时可以在任何地方使用。您倾向于使用单例或始终从 AppDelegate 访问它可能是要走的路。否则,为了回答您的问题,请在推送视图控制器之前将其设置为您要转换到的视图控制器上的属性,或者按照您的描述在prepareForSegue
中设置。要启动该过程,根视图控制器可以实例化它,也可以从 AppDelegate 的 init
、loadView
或 viewDidLoad
方法中访问它并保留对它的引用。
对我来说,决定取决于几个月或几年后当我阅读代码时哪种方法更明显,以及我想要维护哪种方法。
【讨论】:
【参考方案3】:如果在 AppDelegate 中设置了 NSManagedObjectContext,则不要传递它;相反,您创建对它的引用:
AppDelegate *appDel = [UIApplication sharedApplication].delegate;
NSManagedObjectContext *context = appDel.managedObjectContext;
您引用它的对象类型无关紧要。
【讨论】:
以上是关于如果它是子视图控制器,如何将 AppDelegate 中的 managedObjectContext 传递给正确的视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用objective-C在ios 9中隐藏特定视图控制器的状态栏