我还使用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''
答案 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;
}