如何通过Interface Builder的XIB传递NSManagedObjectContext

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

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

通过这种设置,人们如何干净地将应用程序委托的NSManagedObjectContext分配或传递给视图控制器的IBOutlet属性。 有一个导航控制器的方式:)和应用程序委托没有UIViewController的直接属性。

这是一个奇怪的问题,我想将一个XIB组件的属性链接到另一个组件的属性。 我所做的大部分XIB工作都需要一个属性,然后将它指向XIB中的一个对象,然后将其实例化为正常流程,但在这种情况下,上下文在应用程序委托中正确创建,我只想在实例化时将其传递给视图控制器。


您不需要传递它,只需根据需要从应用程序委托中获取它即可:

#import "MyAppDleegate.h"

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

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开始。


你有正确的想法,但你正在摔角的问题似乎完全是你自己的创造。 你说你的应用程序委托有一个导航控制器的出口,但不是导航控制器的根视图控制器,因为你已经设置了你的笔尖,以便在加载笔尖时创建视图控制器。 这没什么不妥,但也没有理由说应用程序代表不应该为该控制器设置插座。 事实上,网点的全部理由是要获得从笔尖加载的东西的参考。

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

关于你关于多视图控制器的问题,我想知道什么样的真实世界的应用程序可能具有需要数据的视图控制器(A),加载不需要任何数据的另一个视图控制器(B),然后是第三个(三)又需要数据? 一个现实的例子可能会有所帮助,如果有的话。

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

链接地址: http://www.djcxy.com/p/91651.html

上一篇: How to pass NSManagedObjectContext via Interface Builder's XIBs

下一篇: How to synchronise two NSManagedObjectContext