CoreData UITableViewController managedObjectContext错误

时间:2011-12-08 15:28:21

标签: iphone objective-c core-data 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

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

该行位于app委托的didFinishLaunchingWithOptions方法中,就像在新的核心数据项目中一样。

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

#import <UIKit/UIKit.h>

#import <CoreData/CoreData.h>

@interface myTableViewController : UITableViewController <NSFetchedResultsControllerDelegate>

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

@end

4 个答案:

答案 0 :(得分: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;
}

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

您有两种选择:

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

 [[[UIApplication sharedApplication] delegate] mainManagedObjectContext];

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

答案 1 :(得分:2)

您遗漏了一些将UIViewController(或其子类)链接到NSFetchedResultsController的连线。当您设置启用了Core Data的新项目时,您可以免费获得该项目,但如果您要将Core Data添加到现有项目中,则需要自己连接一些内容。

有关详细信息,请参阅http://wiresareobsolete.com/wordpress/2009/12/adding-core-data-existing-iphone-projects/

答案 2 :(得分:2)

这取决于您的应用程序的结构。如果你在所有代码前面使用TabBarViewController有点不同

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    UITabBarController *tabController = (UITabBarController *)self.window.rootViewController;

    UINavigationController *navigationController = (UINavigationController *)[[tabController viewControllers] objectAtIndex:0];
    MasterViewController *controller = (MasterViewController *)[[navigationController viewControllers] objectAtIndex:0];
    controller.managedObjectContext = self.managedObjectContext;

    return YES;
}

答案 3 :(得分:1)

我遇到了同样的问题。我通过确保ManagedContextObject属性包含在根视图控制器(连接到第一个导航控制器的第一个视图控制器)中来解决它,无论它是否使用它。

在根视图控制器的.h中:

@property (nonatomic, strong) NSManagedObjectContext *managedObjectContext;
<。> <。>

@synthesize managedObjectContext;
如果我的答案有点愚蠢,请道歉。为了理解它们,我必须为自己愚蠢的事情:)