2

我一直在 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;
}

在原始线程中,它说我需要为每个要在其上使用核心数据的选项卡的每个 navController 创建一个 IBOutlet。

虽然您可以为 UINavigationController 分配多个委托,但对于插座而言并非如此,但您只能为 navController 提供一个插座。

我可以让 Page1 工作,但其他页面只是崩溃;因为缺少 IBOutlet。

对于 Y 标签,我真的需要 X IBOutlets 还是可以用另一种方式来做?

另一个问题是接受答案的原始线程是:

理想情况下,您希望将 NSManagedObjectContext、NSFetchedResultsController 或相关的 NSManagedObject “向下”传递到 UIViewController。

但是没有代码或示例说明如何执行此操作。

理想情况下,我不想使用单例或到处使用应用程序委托。

任何确认和澄清都会很棒。

谢谢。

4

1 回答 1

2

您的直接问题与 Core Data 无关。当您需要为每个选项卡使用单独的导航控制器时,您将为每个选项卡分配相同的导航控制器,否则每次更改选项卡时导航控制器的视图层次结构都会被打乱。

您链接到的问题中推荐的模式称为“依赖注入”,它是 Apple 在大多数情况下推荐的模式。但是,在标签栏或任何其他复杂的视图/视图控制器层次结构的情况下,依赖注入可能会变得复杂。这是选项卡栏的一个特殊问题,因为您通常不会在应用程序启动时加载所有选项卡视图/视图控制器,而是等到每个选项卡被选中后再加载其元素。

相反,您可以使用利用 UIApplication 对象单例状态的替代模式。由于只有一个应用程序对象,因此只有一个应用程序委托对象。这意味着您可以在应用程序的任何地方进行如下调用:

(MyApplicationDelegate *) appDelegate=(MyApplicationDelegate *)[[UIApplication sharedApplication] delegate];

...并始终获得相同的应用程序对象。然后,如果您将托管对象上下文定义为应用程序委托的属性,您可以通过以下方式获取上下文:

theManagedObjectContext=appDelegate.managedObjectContext

将这两行添加到每个视图控制器中,您始终可以确保获取应用程序委托的托管对象上下文。

于 2011-05-26T23:55:02.863 回答