CoreData UITableViewController managedObjectContext错误

Jos*_*ane 4 iphone core-data objective-c uitableview

我已经开始使用CoreData并使用CoreData创建一个新项目并将这些基础构建到我自己的项目中.我已达到一个阶段,我或多或少地相同地复制了新项目,但是我收到了错误.

这条线,controller.managedObjectContext = self.managedObjectContext;给我带来了麻烦.当我发表评论时,应用程序只需启动一个空白的UITableView,但如果我包含该行,则会导致此错误:

Universal[24718:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UITableViewController setManagedObjectContext:]: unrecognized selector sent to instance 0x1521a0'
*** First throw call stack:
(0x344558bf 0x346a51e5 0x34458acb 0x34457945 0x343b2680 0x2413 0x378367eb 0x378303bd 0x377fe921 0x377fe3bf 0x377fdd2d 0x30c30df3 0x34429553 0x344294f5 0x34428343 0x343ab4dd 0x343ab3a5 0x3782f457 0x3782c743 0x2331 0x22c8)
terminate called throwing an exception
Run Code Online (Sandbox Code Playgroud)

我需要再看一下代码,我可以提供它,我希望你知道发生了什么.我看不到会导致这种情况的任何内容,我没有收到任何错误,但是我得到了这个日志,因为该行导致整个应用程序崩溃.

该行驻留在didFinishLaunchingWithOptionsapp delegate 的方法中,就像在新的核心数据项目中一样.

根据要求,表视图控制器的头文件:

#import <UIKit/UIKit.h>

#import <CoreData/CoreData.h>

@interface myTableViewController : UITableViewController <NSFetchedResultsControllerDelegate>

@property (strong, nonatomic) NSFetchedResultsController *fetchedResultsController;
@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;

@end
Run Code Online (Sandbox Code Playgroud)

Kev*_*ndt 6

您收到错误的原因在于AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
    MasterViewController *controller = (MasterViewController *)navigationController.topViewController;
    controller.managedObjectContext = self.managedObjectContext;
    return YES;
}
Run Code Online (Sandbox Code Playgroud)

使用默认CoreData模板时,托管对象上下文被分配给topViewController,而topViewController不再是MasterViewController,因为您已插入另一个视图作为起点.因此,无法识别的选择器被发送到实例.

您有两种选择:

1)删除分配托管对象上下文的代码,并在需要它的视图中获取它

 [[[UIApplication sharedApplication] delegate] mainManagedObjectContext];
Run Code Online (Sandbox Code Playgroud)

2)保留代码(更正类名),为managedObjectContext添加声明,并在所有UIViewControllers之间的所有应用程序中传递NSManagedObjectContext对象

  • @ tzuchien.chiu创建你自己的答案,显示正确的模式或链接到一篇文章会更有帮助. (2认同)