2012-02-19 6 views
1

私はここで私の頭をはるかに上回っているかもしれませんが、かなり基本的なものがないと思われます。私は、スタックや他のフォーラムで解決策を見つけるための助けを求めてきました。私は見つけたすべての解決策を試しましたが、私の状況には何の働きもなく、私は何が欠けているのか分かりません。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を渡すことを検討しています。

私はすべてが意味を成就することを願っています。 :)

+0

おそらくこれをcodereview.stackexchange.comに提出してください – David

+1

私はあなたのviewControllerインスタンスをインスタンス化していませんか? – user523234

答えて

1

私は私の問題の答えを発見しました。 managedObjectContextは、私のviewControllerに正しく渡されていませんでした。

私が使っていた:

viewController.managedObjectContext = self.managedObjectContext; 

私が使用している必要があります。右の行に私を置くためのuser523234

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

感謝を。

関連する問題