2011-12-08 46 views
4

我已經開始玩弄CoreData並採取與CoreData一個新的項目,建設這些基礎到我自己的項目。我已經到了一個階段,我或多或少地重複了新項目,但是我收到了一個錯誤。CoreData的UITableViewController managedObjectContext錯誤

這條線,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 

我需要再代碼看,我可以提供它,我希望你有什麼想法發生。我看不到任何會導致這種情況的東西,我沒有收到任何錯誤,但是我得到這個日誌,因爲該行導致整個應用程序崩潰。

線駐留在應用程序委託的didFinishLaunchingWithOptions方法,就像在新鮮核心數據項目。

按照要求,爲表視圖控制器頭文件:

#import <UIKit/UIKit.h> 

#import <CoreData/CoreData.h> 

@interface myTableViewController : UITableViewController <NSFetchedResultsControllerDelegate> 

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

@end 
+0

請顯示'controller'類的頭文件。 – Jim

+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不再是MasterViewController,因爲您插入了不同的視圖作爲您的出發點。因此無法識別的選擇器被髮送到實例。

你有兩個選擇:

1)拆下來分配管理對象上下文有關的代碼,並在需要它得到它像這樣

[[[UIApplication sharedApplication] delegate] mainManagedObjectContext]; 

2)保持代碼視圖(正確類名),添加聲明managedObjectContext,並通過您的NSManagedObjectContext對象在整個所有的UIViewControllers之間的所有應用程序

+0

通過應用程序委託單例共享託管對象上下文通常被稱爲反模式,這使得架構變得僵化。在大多數實現中不應該鼓勵它。 –

+2

@ tzuchien.chiu創建自己的答案顯示正確的模式或鏈接到一篇文章會更有幫助。 – Tom

2

你丟失了一些佈線鏈接UIViewController S(或它們的亞類)至多NSFetchedResultsController。當你創建一個啓用了核心數據的新項目時,你可以免費獲得它,但是如果你將核心數據添加到現有項目中,你需要自己連接一些東西。

欲瞭解更多信息,請參閱http://wiresareobsolete.com/wordpress/2009/12/adding-core-data-existing-iphone-projects/

+0

在所鏈接的教程中顯示的小調整,我也愚蠢地忘了在Interface Builder中設置視圖的類。但是,如果我的表視圖控制器是根視圖,這將工作,如果我想能夠進一步訪問它,該怎麼辦?我需要更改其中的一行,對嗎? 'UINavigationController * navigationController =(UINavigationController *)self.window.rootViewController; guest_MasterViewController * controller =(guestListMasterViewController *)navigationController.topViewController; controller.managedObjectContext = self.managedObjectContext;' –

+0

是的,您需要在正確的UIViewController上設置managedObjectContext。根據你發佈的代碼數量,我無法確切地告訴你該做什麼,但你幾乎就在那裏。 – occulus

+0

那麼我給出的代碼設置了我想要的視圖的managedObjectContext,但沒有在正確的位置,因爲它不是topViewController。所以我不知道如何獲得這個視圖的上下文,不管它的層次結構如何。 –

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; 
} 
1

我有同樣的問題。我通過確保ManagedContextObject屬性包含在根視圖控制器(連接到第一個導航控制器的第一個視圖控制器)中,而不管它是否使用它來解決此問題。

在根視圖控制器的.H

@property (nonatomic, strong) NSManagedObjectContext *managedObjectContext; 

。m

@synthesize managedObjectContext; 

道歉,如果我的答案是沉悶了一下。爲了理解它們,我必須爲自己弄虛作假:) :)

相關問題