传递托管对象上下文以从AppDelegate查看控制器

时间:2012-06-23 18:33:33

标签: iphone ios ios5

我想我这里有一些简单的错误。 我试图将AppDelegate的managedObjectContext传递给两个视图控制器。 仅仅为了这个学习演示,两个ViewControllers就在彼此旁边。 (在我的真实应用程序中,它们相距甚远。)

enter image description here

这有效:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;

    Page1ViewController * page1VC = [[navigationController viewControllers] objectAtIndex:0];
    page1VC.managedObjectContext = self.managedObjectContext;

    return YES;
}

但是当我添加第二个视图控制器 - objectAtIndex:1时,它不会:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;

    Page1ViewController * page1VC = [[navigationController viewControllers] objectAtIndex:0];
    page1VC.managedObjectContext = self.managedObjectContext;

    Page2ViewController *page2VC = [[navigationController viewControllers] objectAtIndex:1];
    page2VC.managedObjectContext = self.managedObjectContext;

    return YES;
}

我收到此错误:

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0]'

我确信它接近正确!?如果有人可以提供帮助,将不胜感激。 (顺便说一下,我也将使用segues来传递managedObjectContext!)

1 个答案:

答案 0 :(得分:2)

导航控制器在实例化时不会在其导航树中实例化所有视图控制器;但只有当它们实际上即将出现在屏幕上时。这对内存管理来说是一件非常好的事情。

正如您所提到的,您可以轻松地使用prepareForSegue来传递MOC。 我广泛使用的另一种解决方案是创建一个帮助程序类来为您管理MOC实例,您可以在任何地方使用它。它管理创建自定义上下文,并且还处理线程安全(永远不要在没有创建它的线程上使用MOC!如果你只是自由地传递一个MOC,你可能遇到这个问题)