私はここで私の頭をはるかに上回っているかもしれませんが、かなり基本的なものがないと思われます。私は、スタックや他のフォーラムで解決策を見つけるための助けを求めてきました。私は見つけたすべての解決策を試しましたが、私の状況には何の働きもなく、私は何が欠けているのか分かりません。NSManagedObjectContextをビューコントローラに渡すことができません
私は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
私はNSManagedObjectContextが私のViewControllerでnilである知っています。問題はAppDelegateのコンテキストをViewControllerにどのように渡すのですか? CoreDataを照会するたびに、ViewControllerからAppDelegateに質問する必要はありません(Moreがうまくいけば追加されます)。私はmanagedObjectContextを渡すことを検討しています。
私はすべてが意味を成就することを願っています。 :)
おそらくこれをcodereview.stackexchange.comに提出してください – David
私はあなたのviewControllerインスタンスをインスタンス化していませんか? – user523234