如何在使用UITabBarController时共享ManagedObjectContext

mve*_*xel 13 iphone cocoa-touch core-data uitabbarcontroller cocoa-design-patterns

我有一个iPhone应用程序,它有一个MainWindow.xib,上面有一个UITabBarController,它在ViewControllers数组中有一个UINavigationController和一个自定义的UIViewController子类.UINavigationController和自定义视图控制器的根视图控制器都是从其他xib文件加载的.

该应用程序使用核心数据,堆栈在应用程序委托中初始化(根据惯例).

app委托将UITabBarController添加到窗口:

- (void)applicationDidFinishLaunching:(UIApplication *)application {        
    // Configure and show the window
    [window addSubview:[tabBarController view]];
    [window makeKeyAndVisible];
}
Run Code Online (Sandbox Code Playgroud)

我意识到我需要传播一个指向应用程序委托中创建的ManagedObjectContext的指针,但我不知道如何继续(甚至在这里这里阅读关于该主题的所有好的评论):

  • 我是否将ManagedObjectContext传播到UITabBarController并从那里传播到各个视图控制器,如果是,如何?
  • 或者我将ManagedObjectContext直接传播到UINavigationController的根视图控制器和自定义视图控制器,我该怎么做?

我想我不太了解如何使用UITabBarController.

Mar*_*rra 14

理想情况下,你想传递要么NSManagedObjectContext,NSFetchedResultsController或有关NSManagedObject"向下"进入UIViewController.这允许"父母"控制"孩子"并确定孩子应该拥有什么.这样可以创建更松散耦合的设计,并允许您UIViewController根据需要轻松地重新排列实例.它还使重用a更容易UIViewController.

在标签视图设计中它没有什么不同.你的AppDelegate将NSManagedObjectContext负责传递给负责创建进入的初始UIViewController实例的人UITabBarController.反过来,创建者在构建实例时将相关信息(NSManagedObject,NSFetchedResultsController和/或NSManagedObject实例)传递给UIViewController实例.


ger*_*ry3 11

如果要使用依赖项注入方法通过选项卡栏控制器传递托管对象上下文,则更强大的解决方案是在所有视图控制器上循环applicationDidFinishLaunching:

for (id vc in tabBarController.viewControllers) {
    [vc setManagedObjectContext:self.managedObjectContext];
}
Run Code Online (Sandbox Code Playgroud)