Ios 如果在我的应用程序退出后,我将某些内容保存到核心数据中,那么每次启动后它都会崩溃。为什么?
当我的应用程序转到后台时,我调用此方法:Ios 如果在我的应用程序退出后,我将某些内容保存到核心数据中,那么每次启动后它都会崩溃。为什么?,ios,objective-c,core-data,Ios,Objective C,Core Data,当我的应用程序转到后台时,我调用此方法: - (void)saveArticlePosition { self.article.position = self.position; NSManagedObjectContext *managedObjectContext = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; NSError *error;
- (void)saveArticlePosition {
self.article.position = self.position;
NSManagedObjectContext *managedObjectContext = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
NSError *error;
[managedObjectContext save:&error];
}
来自ApplicationIdentinterBackground
的通知。但是,在下一次应用程序启动时,我遇到以下错误:
[ReadingViewController setManagedObjectContext:]: unrecognized selector sent to instance 0x844fe40
由myAppDelegate.m中的此行引起:
controller.managedObjectContext = self.managedObjectContext;
这是更大部分的一部分:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
RootViewController *controller = (RootViewController *)navigationController.topViewController;
controller.managedObjectContext = self.managedObjectContext;
...
到底出了什么问题?我所能想到的是,当我在ReadingViewController
中保存到核心数据时,controller
对象的类型是RootViewController
,但是我该如何解决这个问题呢?您的ReadingViewController上有一个名为managedObjectContext的实例变量吗
我要问的是,在save方法中,您不使用实例变量来获取上下文,而是通过app委托来查找上下文
这就是错误消息所显示的内容:
[ReadingViewController setManagedObjectContext:]: unrecognized selector sent to instance
意味着。您尝试在ReadingViewController实例上调用方法,但ReadingViewController没有具有该名称的方法。(您可能希望在ReadingViewController中实现一个方法setManagedObjectContext:,或者在其中定义一个名为managedObjectContext的属性)
如果将上下文存储在应用程序委托中,则无需将其保存到ReadingViewController中,尤其是在需要时,可通过应用程序委托进行查找。根据错误消息,从navigationController.topViewController获得的对象实际上是ReadingViewController,即使您将其强制转换为RootViewController。ReadingViewController似乎没有managedObjectContext属性
我也不确定您为什么要尝试设置该属性,因为代码表明您直接从AppDelegate获取managedObjectContext,而不是从saveArticlePosition中的本地属性。如何使它使用AppDelegate而不是ReadingViewController中的方法?我试图让一切都在AppDelegate之外运行。我得到的是一行controller.managedObjectContext=self.managedObjectContext
看起来不必要-如果您的ReadingViewController
上没有managedObjectContext
属性,请删除该行。并且您的保存方法已经在通过应用程序委托访问上下文。看起来您混合了两种访问上下文的方式。您可以在应用程序代理中设置它,并将其传递给视图控制器(从样式上看,我认为这是更好/更干净的方法),或者,您可以通过请求应用程序代理直接访问它(这是您的保存方法已经在做的)。你正在尝试两种方法,一种或另一种-任何一种方法都会起作用,两种方法都会让你困惑。我想我明白你的意思了,但是如果我的self.article
对象是来自核心数据的对象,如何在更改值后不使用某种save
方法将我提供的新值保存到持久存储中?你是在建议我只做“设置”行吗?如果是这样的话,我该如何使用AppDelegate呢?我想我只是对在这个场景中应该如何使用AppDelegate感到困惑,因为我只想将它保存到持久存储中。抱歉,如果我现在像橡树一样稠密,我对核心数据非常陌生。当你说在你的应用程序委托中设置它并将其传递给你的视图控制器会更好时,你到底是什么意思?你能详细说明一下吗?在viewdiload
中创建特定于视图控制器的managedObjectContext
版本?我正在尝试使用AppDelegate执行所有操作。我正在读取ViewController,我引用的核心数据中的一个对象需要更改一个值。我做错了什么,让它不在AppDelegate之外运行?我只是想把一些东西保存到核心数据中。也许你对保存感到困惑/迷恋。崩溃不是在保存时发生的,而是在您的应用程序中:didFinishLaunchingWithOptions:。我假设您已经在其他地方设置了managedObjectContext(self.managedObjectContext)——不必要的部分似乎是将其设置到视图控制器的那一行。如果该对象上没有属性或实例变量,则该值没有点设置。“将方法保存为书面形式”不依赖于传递给它的managedObjectContext,因为您是通过应用程序委托直接访问它的。