首先,每个获取结果控制器 (FRC) 实例都针对每个 tableview 进行配置,因此您不会将 FRC 从 tableview 控制器传递到 tableview 控制器。相反,每个 tableview 控制器都实例化并专门为其 tableview 配置一个新的 FRC。
在表视图为主视图的主从设计中,您不会将 FRC 传递给详细视图,而只是将所选表视图行表示的单个托管对象传递给。
Apple 建议通过“依赖注入”传递托管对象上下文 (MOC)。这很简单。在最常见的设计中,您在应用程序委托中初始化 MOC,然后为每个视图控制器提供 managedObjectContext 属性。然后,当您加载/推送视图控制器时,只需将其 managedObjectContext 属性设置为 MOC。
例如,在主从设计中,您通常有一个导航控制器 (NAV)。要了解它是如何工作的,请使用 Xcode 中基于导航的应用程序模板创建一个测试应用程序。将其标记为使用 Core Data。你会发现应用程序委托和RootViewController 都有一个managedObjectContext 属性。
现在在应用代理的applicationDidFinishLaunching:... 方法中添加代码,使其看起来像:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
// Add the navigation controller's view to the window and display.
RootViewController *topVC=(RootViewController *) self.navigationController.topViewController;
topVC.managedObjectContext=self.managedObjectContext;
self.window.rootViewController = self.navigationController;
[self.window makeKeyAndVisible];
return YES;
}
...然后在RootViewController.m 添加:
- (void)viewDidAppear:(BOOL)animated
{
NSLog(@"self.managedObjectContext = %@",self.managedObjectContext);
[super viewDidAppear:animated];
}
当您运行测试应用程序时,RootViewController 对象将记录它的 managedObjectContext 属性,例如:
2011-07-19 09:24:05.193 CDNavTemplate[3203:207] self.managedObjectContext = <NSManagedObjectContext: 0x4d318a0>
...证明RootViewController 对象具有来自应用委托的托管对象上下文。
现在,您只需为推送到导航控制器堆栈的每个视图控制器重复该过程,逐步将相同的托管对象上下文对象传递到视图层次结构中。您可以以完全相同的方式传递任何其他类型的对象。
Apple 推荐依赖注入,因为它使代码更加模块化,并且可以轻松地在单个应用程序中使用多个托管对象上下文。您只需向每个特定的视图控制器传递它在任何特定时间所需的特定上下文。