无法将NSManagedObjectContext传递给我的视图控制器

好的,我可能会在这里头,但怀疑我错过了一些非常基本的东西。 我已经在堆栈和其他论坛上寻找帮助寻找解决scheme。 我尝试了所有我find的解决scheme,但没有为我的情况工作,我看不到我失踪。

我已经创build了一个CoreData应用程序。 在我的appDelegate中使用NSManagedObjectContext读取和写入数据到CoreData存储的所有工作都很好。 我已经检查,看看是否NSManagedObjectContext设置在我的AppDelegate,它是。 传递给我唯一的viewController后,我检查它是否设置,它不是。 所以这显然是我的问题。 我已经尝试了一切,无法摸索解决方法,现在累了,想要去睡觉。 我对iOS很新,所以我相信这是根本。

这是我的代码,因为它代表。

AppDelegate.m

#import "AppDelegate.h" #import "ViewController.h" #import "Recipe.h" @interface AppDelegate() @property (nonatomic, strong) NSManagedObjectContext *managedObjectContext; @property (nonatomic, strong) NSManagedObjectModel *managedObjectModel; @property (nonatomic, strong) NSPersistentStoreCoordinator *persistentStoreCoordinator; @property (nonatomic, strong) ViewController *viewController; @end @implementation AppDelegate @synthesize managedObjectModel, managedObjectContext, persistentStoreCoordinator, viewController; @synthesize window = _window; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSManagedObjectContext *context = [self managedObjectContext]; if (!context) { NSLog(@"There is an error!!!"); } if (context == nil) { NSLog(@"Context is nil in appdelegate"); } else { NSLog(@"Context is set in appdelegate"); } viewController.managedObjectContext = self.managedObjectContext; // Override point for customization after application launch. return YES; } #pragma mark - Core Data - (NSManagedObjectModel *)managedObjectModel { if (managedObjectModel == nil) { NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"RecipeBook" ofType:@"momd"]; NSURL *modelURL = [NSURL fileURLWithPath:modelPath]; managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; } return managedObjectModel; } - (NSString *)documentsDirectory { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; return documentsDirectory; } - (NSString *)dataStorePath { return [[self documentsDirectory] stringByAppendingPathComponent:@"DataStore.sqlite"]; } - (NSPersistentStoreCoordinator *)persistentStoreCoordinator { if (persistentStoreCoordinator == nil) { NSURL *storeURL = [NSURL fileURLWithPath:[self dataStorePath]]; persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel]; NSError *error; if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) { NSLog(@"Error adding persistent store %@, %@", error, [error userInfo]); abort(); } } return persistentStoreCoordinator; } - (NSManagedObjectContext *)managedObjectContext { if (managedObjectContext == nil) { NSPersistentStoreCoordinator *coordinator = self.persistentStoreCoordinator; if (coordinator != nil) { managedObjectContext = [[NSManagedObjectContext alloc] init]; [managedObjectContext setPersistentStoreCoordinator:coordinator]; } } return managedObjectContext; } @end 

ViewController.h

 #import <UIKit/UIKit.h> @interface ViewController : UITableViewController { NSArray *recipes; NSManagedObjectContext *managedObjectContext; } @property (nonatomic, retain) NSArray *recipes; @property (nonatomic, retain) NSManagedObjectContext *managedObjectContext; @end 

ViewController.m

 #import "ViewController.h" #import "Recipe.h" @interface ViewController () @end @implementation ViewController @synthesize recipes; @synthesize managedObjectContext; - (void)viewDidLoad { [super viewDidLoad]; NSLog(@"View Did Load"); NSManagedObjectContext *context = [self managedObjectContext]; if (!context) { NSLog(@"There is an error!!!"); } if (context == nil) { NSLog(@"Context is nil in viewController"); } else { NSLog(@"Context is set in viewController"); } } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); } else { return YES; } } - (void)viewDidUnload { [super viewDidUnload]; } @end 

我知道在我的ViewController NSManagedObjectContext是零。 问题是如何将我的上下文从AppDelegate传递到ViewController? 我不想问我的viewControllers的AppDelegate(更希望将被添加),每当我想查询CoreData,我正在寻找传递managedObjectContext周围。

我希望一切都有道理。 🙂

我发现了我的问题的答案。 managedObjectContext没有正确传递给我的viewController。

我正在使用:

 viewController.managedObjectContext = self.managedObjectContext; 

当我应该使用:

 ViewController *viewController = (ViewController *)self.window.rootViewController; viewController.managedObjectContext = self.managedObjectContext; 

感谢user523234把我放在正确的线上。