1

我想我在这里有一些简单的错误。我正在尝试将 AppDelegate 的 managedObjectContext 传递给两个视图控制器。就这个学习演示而言,两个 ViewController 是紧挨着的。(在我的真实应用中,它们会相距很远。)

在此处输入图像描述

这有效:

- (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!)

4

1 回答 1

2

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

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

于 2012-06-23T18:39:46.617 回答