Ios -[UITableViewController setManagedObjectContext:]:无法识别的选择器发送到实例0x7490da0';

Ios -[UITableViewController setManagedObjectContext:]:无法识别的选择器发送到实例0x7490da0';,ios,core-data,Ios,Core Data,我知道错误发生在这一行,因为应用程序工作正常,这一行被注释掉了: controller.managedObjectContext = self.managedObjectContext; 错误是: 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[UITableViewController setManagedObjectContext:]:发送到实例0x7490da0的选择器无法识别” fibromapppdelegate.h // //

我知道错误发生在这一行,因为应用程序工作正常,这一行被注释掉了:

controller.managedObjectContext = self.managedObjectContext;
错误是:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[UITableViewController setManagedObjectContext:]:发送到实例0x7490da0的选择器无法识别”

fibromapppdelegate.h

//
//  fibroMappAppDelegate.h
//  fibromapp
//
//  Created by jamie mcallister on 09/08/2013.
//  Copyright (c) 2013 Jamie McAllister. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface fibroMappAppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

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

- (void)saveContext;
- (NSURL *)applicationDocumentsDirectory;

@end

您所要做的就是删除此行:

controller.managedObjectContext = self.managedObjectContext;
在视图中需要托管对象上下文时,请使用:

[(fibroMappAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];

这意味着当你这样做时:

controller.managedObjectContext = self.managedObjectContext;

控制器
没有
managedObjectContext
属性,因此无法为其分配任何内容。您没有发布
controller
的代码,因此我不知道它到底是什么样子,但错误消息说它是
UITableViewController
。如果您想以正确的方式解决此问题,您需要为
controller
提供
managedObjectContext
属性,以便可以执行此分配。

错误表示您使用的是非子类UITableViewController,并且认为您使用的子类具有名为
managedObjectContext
的属性。检查您的故事板、xib或代码,看看这是在哪里发生的


由于您正在尝试使用依赖项注入(顺便说一句,这是一件非常好的事情),因此我建议检查您在何处创建
控制器
,并对其进行更改,以使其使用具有正确属性的
UITableViewController的子类。

fibroMappMasterViewController的代码?它是否具有managedContext?从错误消息中显示控制器是UITableviewController,而不是fibroMappMasterViewController。此外,如果您“对iOS完全陌生”,那么从使用核心数据的项目开始可能不是最好的做法——这不是一个初学者级别的api。Objective-C编码约定要求类名的开头使用大写字母。您不会得到编译错误,但强烈建议。@rdelmar轻松起步对我来说不是一个选项不幸的是,我需要制作这个应用程序来产生一些收入(我被要求为某人制作,我得到50%的利润)@MarcusS.Zarra yeh,在我开始这个应用程序后,我在大学里学到了编程,所以你的意思是我会使用context=[(fibroMappAppDelegate*)[[UIApplication sharedApplication]delegate]managedObjectContext]?这是一种不太理想的模式。您应该使用依赖项注入,而不是总是访问MOC的应用程序代理。最好是解决代码错误,而不是这样做。@MarcusS.Zarra我说过我知道,我不知道依赖注入是什么,也不知道怎么做:/你能解释一下我会怎么做吗@AbdullahShafique我尝试了你的建议,在将我的fibroMappAppDelegate.m导入文件后,我添加了以下代码
-(void)done:(id)sender{NSManagedObjectContext*context=[(fibromappPappdelegate*)[[UIApplication sharedApplication]delegate]managedObjectContext];[self dismissionViewControlleranimated:YES completion:NULL];]
出现一个错误,说“链接器命令失败,退出代码为1(使用-v查看调用)”,Marcus只是说您第一次尝试正确地执行此操作,并且您应该修复您正在执行的操作,而不是遵循此建议。因为这不是他的问题的解决方案。解决方案是将UITableViewController子类化并添加属性,以便他能够正确地执行依赖项注入。感谢tom和marcus,我通过创建一个属于UITableView子类的新类并添加属性,然后将其分配给我的第一个视图控制器来解决此错误
controller.managedObjectContext = self.managedObjectContext;