使UITabBarController与Core Data一起使用

问题描述

| 我一直在Stackoverflow上阅读此线程,并一直尝试在我自己的项目中没有成功复制解决方案。 我的项目有4个标签。在我的应用程序委托中,我这样做:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    


    Page1 *page1 = (Page1 *)[navController topViewController];
    Page2 *page2 = (Page2 *)[navController topViewController];
    Page3 *page3 = (Page3 *)[navController topViewController];
    Page4 *page4 = (Page4 *)[navController topViewController];

    page1.managedobjectContext = self.managedobjectContext;
    page2.managedobjectContext = self.managedobjectContext;
    page3.managedobjectContext = self.managedobjectContext;
    page4.managedobjectContext = self.managedobjectContext;


    [self.window makeKeyAndVisible];

    return YES;
}
在原始线程中,它说我需要为要在其上使用Core数据的每个选项卡的每个navController创建一个IBOutlet。 尽管您可以为UINavigationController分配多个委托,但对于插座而言并非如此,但您只能为navController提供一个插座。 我可以让Page1正常工作,但其他页面却崩溃了;因为缺少IBOutlet。 我是否真的需要X IBOutlets来放置Y选项卡,还是可以用其他方式来做? 另一个问题是原始线程接受的答案是:   理想情况下,您希望通过   NSManagedobjectContext,   NSFetchedResultsController或   相关的NSManagedobject“向下”到   UIViewController。 但是没有代码或如何执行此操作的示例。 理想情况下,我不想在各处使用singelton或使用应用程序委托。 任何确认和澄清都很好。 谢谢。     

解决方法

您的直接问题与核心数据无关。当您需要为每个选项卡使用单独的导航控制器时,将为每个选项卡分配相同的导航控制器,否则每次更改选项卡时,导航控制器的视图层次结构都会变得混乱。 您链接到的问题中推荐的模式称为“依赖注入”,这是Apple在大多数情况下推荐的模式。但是,在使用标签栏或任何其他复杂的视图/视图控制器层次结构的情况下,依赖项注入会变得很复杂。标签栏的问题特别严重,因为在应用启动时,您通常不会加载所有标签视图/视图控制器,而是要等到每个标签被选中后再加载元素。 相反,您可以使用利用UIApplication对象单例状态的替代模式。由于只有一个应用程序对象,因此只有一个应用程序委托对象。这意味着您可以在应用程序中的任何地方进行如下调用:
(MyApplicationDelegate *) appDelegate=(MyApplicationDelegate *)[[UIApplication sharedApplication] delegate];
...并始终获得相同的应用程序对象。然后,如果将托管对象上下文定义为应用程序委托的属性,则可以通过以下方式获取上下文:
theManagedObjectContext=appDelegate.managedObjectContext
将这两行添加到每个视图控制器,您始终可以确保获取应用程序委托的托管对象上下文。