2012-06-23 81 views
1

我想我在这里有一些简单的错误。 我想通过AppDelegate的managedObjectContext到两个视图控制器。 只为这个学习演示,两个ViewControllers是紧挨着的。 (在我的真正的应用程序,他们将相隔很远。)传递托管对象上下文从AppDelegate查看控制器

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

回答

2

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

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

+0

感谢您的回应。但是,你知道为什么第一个可以工作吗(即objectAtIndex:0)?我还在这里发现了这个技巧:http://timroadley.com/2012/02/19/core-data-basics-part-4-relationships/它暗示它应该工作。 :| –

+0

第一个工作正常,因为导航控制器有一个控制器,正在显示。 – EmilioPelaez

+0

这很有道理,谢谢Emilio。 –

相关问题