2013-07-29 21 views
0

當我的應用程序轉到後臺,我調用這個方法:如果在我的應用程序退出後,我將某些內容保存到Core Data中,則每次都會在以下啓動時崩潰。爲什麼?

- (void)saveArticlePosition { 
    self.article.position = self.position; 

    NSManagedObjectContext *managedObjectContext = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
    NSError *error; 

    [managedObjectContext save:&error]; 
} 

applicationDidEnterBackground的通知。然而,在接下來的應用程序啓動,我得到這個錯誤:

[ReadingViewController setManagedObjectContext:]: unrecognized selector sent to instance 0x844fe40 

在此行引起了我AppDelegate.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; 
    ... 

究竟是什麼問題?我所能想到的是,controller對象的類型爲RootViewController,而我保存到Core Data的ReadingViewController,但我該如何解決該問題?

回答

0

您的ReadingViewController上是否有名爲managedObjectContext的實例變量?

我問,與你的保存方法一樣,你不使用實例變量來獲取上下文,而是通過應用程序委託來查找上下文。

這就是錯誤消息:

[ReadingViewController setManagedObjectContext:]: unrecognized selector sent to instance 

手段。您已嘗試在ReadingViewController實例上調用方法,而ReadingViewController沒有具有該名稱的方法。 (你會希望在ReadingViewController中實現一個方法setManagedObjectContext:或者在其中定義一個名爲managedObjectContext的屬性)。

如果將上下文存儲在您的應用程序委託中,則無需將其保存到您的ReadingViewController中,尤其是在需要時,您可以通過應用程序委託來查找它。

+0

那麼我如何使用AppDelegate而不是在ReadingViewController中使用該方法呢?我試圖讓所有的東西都在AppDelegate之外運行。 –

+0

我得到的是'controller.managedObjectContext = self.managedObjectContext'這行''看起來沒有必要 - 如果你的'ReadingViewController'沒有'managedObjectContext'屬性,那麼刪除該行。 –

+0

並且您的保存方法**已經**正在通過應用程序委託訪問上下文。看起來你正在混合兩種訪問上下文的風格。你可以在你的應用程序委託中設置它,並將它傳遞給你的視圖控制器(風格明智,我認爲這是更好的/更乾淨的方法),或者,你可以直接通過請求應用程序委託來訪問它它(這是你的保存方法已經在做什麼)。你正在努力做到這一點,做一個或另一個 - 任何一種方法都可以工作,兩者一起就是令你困惑的事情。 –

0

根據錯誤消息,即使您將它轉換爲RootViewController,您從navigationController.topViewController獲得的對象實際上也是一個ReadingViewController。 ReadingViewController似乎沒有managedObjectContext屬性。

我也不知道爲什麼你試圖設置該屬性,因爲代碼表明你直接從AppDelegate獲取managedObjectContext而不是saveArticlePosition中的本地屬性。

+0

我正在嘗試做所有的事情AppDelegate中。我在ReadingViewController中,並且我引用的核心數據中的對象需要更改值。我做錯了什麼使它不能用於AppDelegate?我只想保存一些內容到核心數據。 –

+0

也許你對節約感到困惑/困惑。崩潰沒有發生在保存中,但在您的應用程序中:didFinishLaunchingWithOptions :.我推測你已經在其他地方設置了managedObjectContext(self.managedObjectContext) - 不必要的位似乎是你將它設置到你的視圖控制器的那一行。如果在該對象上沒有屬性或實例變量,則沒有必要在那裏設置該值。您寫入的保存方法不依賴於傳遞給它的managedObjectContext,因爲您通過應用程序委託直接訪問**。 –

相關問題