核心数据 - 传递参数

时间:2013-09-04 15:37:05

标签: ios objective-c core-data

我还使用Core Data停止了使用空Xcode模板的应用程序。

Xcode在我的App Delegate中自动生成ManagedObjectModel,ManagedObjectCOntex和PersistenStoreCoordinator。

为了保持清洁,我想将ManagedObjectContext传递给我的MainVieController,并将它传递给我的tableViewController(MainViewController是一个包含TableViewController的TabBarViewController)。

这就是我这样做的方式,但似乎不起作用:

App Delegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

  MasterViewController *masterViewController = [[MasterViewController alloc]initWithNibName:@"MasterViewController" bundle:nil];
  [masterViewController setManagedObjectContex:_managedObjectContext];

  [self.window setRootViewController:masterViewController];
  self.window.backgroundColor = [UIColor whiteColor];
  [self.window makeKeyAndVisible];
  return YES;
}

MasterViewController

- (void)viewDidLoad
 {
  [super viewDidLoad];
  TableIngredientsViewController *tableIngredientVC = [[TableIngredientsViewController alloc]init];
  [tableIngredientVC setManagedObjectContex:_managedObjectContex];
  tableIngredientVC.fetchedResultController = _fetchedResultController;

  TablePizzasViewController *tablePizzaVC = [[TablePizzasViewController alloc]init];
  tablePizzaVC.managedObjectContex =  _managedObjectContex;
  tablePizzaVC.fetchedResultController = _fetchedResultController;

  UINavigationController *ingredientNavController = [[UINavigationController alloc]initWithRootViewController:tableIngredientVC];
  UINavigationController *pizzaNavController = [[UINavigationController alloc]initWithRootViewController:tablePizzaVC];
 [self setViewControllers:@[pizzaNavController, ingredientNavController]];
}

这是我得到的错误,看起来像managedObjectContext是nill:

 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+entityForName: nil is not a legal NSManagedObjectContext parameter searching for entity name 'Ingredient''

2 个答案:

答案 0 :(得分:1)

如果内存服务,Core Data模板为其需要的各种对象(包括MOC)创建访问器方法。您正在访问支持iVar _managedObjectContext,因此不会调用这些访问器方法。尝试通过AppDelegate上的访问器方法-managedObjectContext来获取它。

答案 1 :(得分:1)

首先,你需要使用getter而不是iVar,如上所述。

其次,你不能假设在调用viewDidLoad时已经设置了MOC。

我知道建议的做法是交出你的MOC,但这在大多数情况下会使事情变得非常复杂。但是,如果您使用父级和子级上下文进行更复杂的设置,则需要它。

如果您在所有viewControllers中只使用一个上下文,那么您应该在实际需要时从代理中获取它:

#import "AppDelegate.h"
[...]
- (void) methodThatNeedsToAccessTheMOC {
    AppDelegate *myDelegate = [[UIApplication sharedApplication] delegate];
    NSManagedObjectContext *moc = myDelegate.managedObjectContext;
}