我正在尝试通过将我的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中开始填充东西,而是想弄清楚如何在第三方应用程序中做正确的事情。
答案 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:
之后调用的。