1

我也使用核心数据创建了一个带有空 Xcode 模板的应用程序。

Xcode 在我的 App Delegate 中自动生成 ManagedObjectModel、ManagedObjectCONtex 和 PersistenStoreCoordinator。

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

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

应用代理

- (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;
}

主视图控制器

- (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 为零:

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

2 回答 2

1

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

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

我知道推荐的做法是交出你的 MOC,但这在大多数情况下会使事情变得非常复杂。但是,如果您有一个包含父上下文和子上下文的更复杂的设置,则需要它。

如果您在所有 viewController 中仅使用一个上下文,则应该在实际需要时从委托中获取它:

#import "AppDelegate.h"
[...]
- (void) methodThatNeedsToAccessTheMOC {
    AppDelegate *myDelegate = [[UIApplication sharedApplication] delegate];
    NSManagedObjectContext *moc = myDelegate.managedObjectContext;
}
于 2013-09-05T08:57:16.660 回答
1

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

于 2013-09-04T15:48:01.760 回答