将ManagedObjectContext传递/注入视图控制器

时间:2014-06-28 13:49:42

标签: ios core-data nsmanagedobjectcontext

我正在尝试通过将我的MOC传递到需要它们的视图控制器来做正确的事情。我正在使用第三方库创建一个侧面/导航菜单,我无法弄清楚如何让我的MOC通过SideController进入我的ViewControllers来完成这项工作。

从这开始(简单部分)第1步:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    LoginViewController *rootView = (LoginViewController *) self.window.rootViewController;
    rootView.managedObjectContext = self.managedObjectContext;
}

然后在我的用户登录后,我将其传递给第三部分控制器(这里仍然可以)步骤2:

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    NSString *segueIdentifier = [segue identifier];
    if ([segueIdentifier isEqualToString:@"LoginSegue"]) {
        TheRootViewController *rootViewController = [segue destinationViewController];
        rootViewController.managedObjectContext = self.managedObjectContext;
    }
}

以下是第三部分代码第3步:

- (void)awakeFromNib
{

...
    MyNavigationController *navigationController = [self.storyboard instantiateViewControllerWithIdentifier:@"contentViewController"];
    navigationController.managedObjectContext = _managedObjectContext;
    self.contentViewController = navigationController;
...
}

我的问题是,在步骤2中的segue有机会在RootViewController上设置MOC之前,第3步(awakeFromNib)中的代码被调用。

基本上我能找到的所有示例都是使用故事板,但由于我的第三方应用程序使用代码,因此我有点混合。如何调用awakeFromNib之前将MOC送到TheRootController?这甚至是可能的。还有另一种方式吗?

我真的很早就参与了这个项目,并且不想在AppDelegate中开始填充东西,而是想弄清楚如何在第三方应用程序中做正确的事情。

2 个答案:

答案 0 :(得分:5)

如果你想坚持将MOC从控制器传递给控制器​​,你可以简单地将引用MOC的awakeFromNib代码移动到viewDidLoad中。在prepareForSegue函数完成后将调用viewDidLoad。

我还想补充一点,将MOC填入AppDelegate确实是一个坏主意。但正如@spassas建议的那样,使用管理MOC的单例对象可能是个好主意。我经常在我的项目中使用一个。您可以在此要点中查看示例:https://gist.github.com/grantamos/1156fe4d2461dafd9d67

答案 1 :(得分:0)

如果在视图控制器上进行视频控制时很早就调用

awakeFromNib(在故事板外的任何人获得对该视图控制器的引用之前调用它)。您是否可以将awakeFromNib中的代码移至周期中稍后调用的方法,例如viewWillAppear:viewDidLoad?我相信这些都是在prepareForSegue:之后调用的。