Невозможно передать NSManagedObjectContext моему контроллеру представления - PullRequest
1 голос
/ 19 февраля 2012

Ладно, я могу быть в хорошей форме, но подозреваю, что мне не хватает чего-то совершенно фундаментального.Я искал в стеке и на других форумах помощь в поиске решения.Я перепробовал все найденные решения, но ни одно из них не подходит для моей ситуации, и я не вижу, что мне не хватает.

Я создал приложение CoreData.Все отлично работает при чтении и записи данных в хранилище CoreData с использованием NSManagedObjectContext в моем appDelegate.Я проверил, установлен ли 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.Вопрос в том, как передать мой контекст из AppDelegate в ViewController?Я не хочу опрашивать AppDelegate из моих viewControllers (надеюсь, будет добавлено еще) каждый раз, когда я хочу запросить CoreData, я хочу обойти управление managedObjectContext.

Я надеюсь, что все делаетсмысл.:)

1 Ответ

1 голос
/ 19 февраля 2012

Я нашел ответ на свой вопрос.Управляемый объектный объект не был правильно передан моему viewController.

Я использовал:

viewController.managedObjectContext = self.managedObjectContext;

Когда я должен был использовать:

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

Спасибо пользователю523234поставив меня на правильную линию.

...