如何通过Interface Builder的XIB传递NSManagedObjectContext

时间:2011-03-03 18:18:05

标签: iphone ios uiviewcontroller xib nsmanagedobjectcontext

我有一个简单的iOS应用程序,在UINavigationController下有一个UIViewController。 UIViewController有一个NSManagedObjectContext的IBOutlet。

AppDelegate有一个导航控制器的IBOutlet - 但不是视图控制器。视图控制器自动在XIB进程中实例化(作为导航控制器的子级)。

通过此设置,如何将app delegate的NSManagedObjectContext干净地分配或传递给视图控制器的IBOutlet属性。在路上有一个导航控制器:)并且app委托没有UIViewController的直接属性。

这是一个奇怪的问题,我想将一个属性从一个XIB组件链接到另一个组件的属性。我完成的大部分XIB工作都需要一个属性并将其指向XIB中的一个对象,而该对象又被正常进程实例化,但在这种情况下,正在app代理中正确创建上下文,我只是想要在实例化它时将其传递给视图控制器。

3 个答案:

答案 0 :(得分:0)

您无需传递它,只需根据需要从应用代理中获取它:

#import "MyAppDleegate.h"

NSManagedObjectContext* moc = [(MyAppDelegate*)[UIApplication sharedApplication].delegate managedObjectContext];

答案 1 :(得分:0)

Apple的文档建议您将对托管对象上下文的引用传递给需要它们的类,而不是从您的应用代理引用它。

以下是我的一个核心数据项目中application:didFinishLaunchingWithOptions:的样子。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{        
    LocationsViewController *lvc = (LocationsViewController *)self.navigationController.topViewController;
    lvc.managedObjectContext = self.managedObjectContext;
    assert(lvc.managedObjectContext != nil);
    [self.window addSubview:self.navigationController.view];
    [self.window makeKeyAndVisible];

    return YES;
}

你会看到我也从一个带有单根视图控制器的UINavigationController开始。

答案 2 :(得分:0)

你有正确的想法,但你所挣扎的问题似乎完全取决于你自己的创造。您说您的应用程序委托有一个导航控制器的插座,但不适用于导航控制器的根视图控制器,因为您已设置您的笔尖,以便在加载笔尖时创建视图控制器。这没有什么不对,但是也没有理由认为应用代表不应该为该控制器提供插座。实际上,出口的全部原因是要引用从笔尖加载的东西。

为您的根视图控制器的应用委托添加插座,然后连接它。然后,应用程序委托可以向控制器提供对托管对象上下文的引用。

关于你关于多个视图控制器的问题,我想知道什么样的真实应用可能有视图控制器(A),它需要数据,加载另一个不需要任何数据的视图控制器(B),其次三分之一(C)再次需要数据?如果你有一个真实的例子可能会有所帮助。

请记住,您不必将整个托管对象上下文传递给每个后续视图控制器。您可以通过传递托管对象来传递控制器完成其工作所需的模型部分。