在核心数据的类之间传递 managedObjectContext 时出错

Posted

技术标签:

【中文标题】在核心数据的类之间传递 managedObjectContext 时出错【英文标题】:Error passing managedObjectContext between classes for core data 【发布时间】:2012-04-23 15:29:45 【问题描述】:

我正在关注本教程:http://maybelost.com/2011/12/tutorial-storyboard-app-with-core-data/,我在尝试在类之间传递 managedObjectContext 时遇到此错误:

2012-04-23 09:53:13.969 PictureList[10287:fb03] -[UINavigationController    setManagedObjectContext:]: unrecognized selector sent to instance 0x6d20a80
2012-04-23 09:53:13.992 PictureList[10287:fb03] *** Terminating app due to uncaught  exception 'NSInvalidArgumentException', reason: '-[UINavigationController    setManagedObjectContext:]: unrecognized selector sent to instance 0x6d20a80'
*** First throw call stack:
(0x16ab022 0x183ccd6 0x16accbd 0x1611ed0 0x1611cb2 0x1c05 0x14386 0x15274 0x24183 0x24c38    0x18634 0x1595ef5 0x167f195 0x15e3ff2 0x15e28da 0x15e1d84 0x15e1c9b 0x14c65 0x16626 0x1afd    0x1a65)
terminate called throwing an exception(lldb) 

该错误似乎有点模糊,但我怀疑 UINavigationController 是导致此问题的原因。当我运行它时,该应用程序立即崩溃。

这是我的 Appdelegate.m 的代码,我在其中尝试将 Context 传递给我的初始控制器:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    
    // Pass the managed object context to the root view controller (the login view)
    LoginViewController *rootView = (LoginViewController *)self.window.rootViewController;
    rootView.managedObjectContext = self.managedObjectContext;
    ....
    
return YES;

然后我试图通过 segue 从我的 LoginViewController 传递到下一个类。 LoginViewController.m:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

    UINavigationController *navController = (UINavigationController *)[segue destinationViewController];
    PictureListMainTable *piclist = (PictureListMainTable *)[[navController viewControllers] lastObject];
    piclist.managedObjectContext = managedObjectContext;

我尝试的另一件事是将上下文传递给 UINavigationController:

// This code was customized to handle the navigation controller
// Pass the managed object context to the root view controller (the login view)
UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
LoginViewController *rootView = (LoginViewController *)navigationController.topViewController;
rootView.managedObjectContext = self.managedObjectContext;

使用这种方法,我至少能够让应用程序加载到登录屏幕,但是当我尝试 segue 时,应用程序会崩溃。我该如何解决这个问题?

编辑:好的,找到问题了。在教程中,我不认为导航是在登录控制器之前嵌入的,但导航控制器实际上位于 LoginViewController 和 PictureListMainTable 之间。

【问题讨论】:

你能把你的解决方案写成下面的答案吗?然后你可以接受它,问题就会完成(某事,某事,某事,黑暗面......):-) 【参考方案1】:

错误似乎非常具体,我想说的是:在您的应用程序中的某个点是行 [navController setManagedObjectContext: ...],通过设置 UINavigationController 实例或子类的 managedObjectContext 属性显式或隐式编码(您可以这样做)。

错误是说UINavigationController 没有setManagedObjectContext: 方法。您可能在 .h 中的 @property 声明中使用了错误的设置,在 .m 的界面中缺少更宽松的 @property 行,或者缺少 @synthesize 指令。

【讨论】:

【参考方案2】:

您需要在该 LoginViewController 类中声明一个属性:

在 LoginViewController.h 中:

@property(nonatomic, strong) NSManagedObjectContext *context;

在 LoginViewController.m 中:

@synthesize context;

然后在 applicationDidFinishLaunchingWithOptions 中:

// Pass the managed object context to the root view controller (the login view)
LoginViewController *rootView = (LoginViewController *)self.window.rootViewController;
rootView.context= self.managedObjectContext;

【讨论】:

以上是关于在核心数据的类之间传递 managedObjectContext 时出错的主要内容,如果未能解决你的问题,请参考以下文章

核心数据:使用新创建的 ManagedObject 转至细节控制器

EXC_BAD_ACCESS NSArray of ManagedObjects(核心数据)

managedObject 上的 setValuesForKeysWithDictionary 在 swift 中给出编译错误

controllerDidChangeContent:每次在 Core Data 中创建 ManagedObject 时调用

ManagedObject 和 ObservedObject

如何将 ManagedObjectID 传递给主线程