managedObjectContext无法识别的选择器发送到实例

mva*_*sco 0 core-data nsmanagedobjectcontext ios

我正在学习开发iOS应用程序的教程.我正在使用核心数据.该应用程序的第一个视图是RootViewController.所有Core Data堆栈都在AppDelegate文件中.这是代码的一部分AppDelegate.m,它调用RootViewController文件:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  // Fetch the data to see if we ought to pre-populate
  NSError *error = nil;
  if (![[self fetchedResultsController] performFetch:&error]) {
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
  }

  [self loadFavoriteThingsData];        

  RootViewController *rootViewController = (RootViewController *)[navigationController topViewController];
  [rootViewController setManagedObjectContext:[self managedObjectContext]];       

  [window addSubview:[navigationController view]];
  [window makeKeyAndVisible];
  return YES;
}
Run Code Online (Sandbox Code Playgroud)

现在,在应用程序的另一部分,我需要打开一个新的视图控制器,它是一个副本RootViewController,被称为DoneViewController,但使用其他NSPredicates来显示其他核心数据对象.

RootViewController那里有一个打开MenuViewController文件的按钮,从那里我尝试DoneViewController使用以下方法打开:

- (IBAction)doneToDoaction:(id)sender {
    DoneViewController *viewController = [[DoneViewController alloc] init];

    [self presentViewController:viewController animated:YES completion:nil];
}
Run Code Online (Sandbox Code Playgroud)

但是有一个例外:

[MenuViewController managedObjectContext]: unrecognized selector sent to instance 0x145a0c00
2013-12-26 22:58:23.688  *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[MenuViewController managedObjectContext]: unrecognized selector sent to instance
Run Code Online (Sandbox Code Playgroud)

我想我必须通过managedObjectContextRootViewControllerMenuViewController,然后从MenuViewControllerDoneViewController,但我不知道该怎么做.

小智 8

这是因为您没有使用NSObject类.为此你必须在AppDelegate.h中实现NSObject.就像这个..

@interface AppDelegate : UIResponder <UIApplicationDelegate,NSObject>{
    NSManagedObjectModel *managedObjectModel;
    NSManagedObjectContext *managedObjectContext;
    NSPersistentStoreCoordinator *persistentStoreCoordinator;
}
Run Code Online (Sandbox Code Playgroud)

并添加属性.

@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;

- (NSString *)applicationDocumentsDirectory;
Run Code Online (Sandbox Code Playgroud)

还要在AppDelegate.m文件中添加代码...

 - (NSManagedObjectContext *) managedObjectContext {
    if (managedObjectContext != nil) {
        return managedObjectContext;
    }
    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil) {
        managedObjectContext = [[NSManagedObjectContext alloc] init];
        [managedObjectContext setPersistentStoreCoordinator: coordinator];
    }

    return managedObjectContext;
}

 - (NSManagedObjectModel *)managedObjectModel {
    if (managedObjectModel != nil) {
        return managedObjectModel;
    }
    managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil] ;

    return managedObjectModel;
}

 - (NSPersistentStoreCoordinator *)persistentStoreCoordinator

 {

    if (persistentStoreCoordinator != nil) {
        return persistentStoreCoordinator;
    }
    NSURL *storeUrl = [NSURL fileURLWithPath: [[self  applicationDocumentsDirectory]
                                               stringByAppendingPathComponent: @"<Project Name>.sqlite"]];
    NSError *error = nil;
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]
                                  initWithManagedObjectModel:[self managedObjectModel]];
        if(![persistentStoreCoordinator      addPersistentStoreWithType:NSSQLiteStoreType configuration:nil   URL:storeUrl options:nil error:&error]) 
  {
        /*Error for store creation should be handled in here*/
  }

    return persistentStoreCoordinator;
}
- (NSString *)applicationDocumentsDirectory {
    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}
Run Code Online (Sandbox Code Playgroud)

这对我100%有效.希望这对你有用.