2011-07-19 141 views
5

我的RootViewController包含一個簡單的表視圖。選擇表中的一個條目後,DetailViewController會顯示更多關於所選條目的詳細信息。相關數據對象的數據通過CoreData加載並保存。如何將FetchedResultsController和ManagedObjectContext傳遞給didSelectRowAtIndexPath方法中的DetailViewController? 我是否需要在DetailViewController.h中定義兩者的屬性?你能給我提供一個代碼示例嗎?在多個視圖控制器中使用FetchedResultsController和ManagedObjectContext

回答

19

首先,每個獲取的結果控制器(FRC)實例都是針對每個tableview配置的,因此您不會將FRC從tableview控制器傳遞到tableview控制器。相反,每個tableview控制器實例化並配置一個專門用於其tableview的新FRC。

在主視圖是主視圖的主控設計設計中,您不會將FRC傳遞到詳細視圖,而只是由選定的tableview行表示的單個管理對象。

Apple建議通過「依賴注入」來傳遞託管對象上下文(MOC)。這很簡單。在最常見的設計中,您可以在應用程序委託中初始化MOC,然後爲您的每個視圖控制器提供managedObjectContext屬性。然後,當您加載/推視圖控制器時,您只需將它的managedObjectContext屬性設置爲MOC即可。

例如,在Master-Detail設計中,您通常會使用導航控制器(NAV)。要了解其工作原理,請使用Xcode中的基於導航的應用程序模板創建一個測試應用程序。將其標記爲使用核心數據。您將同時指出應用程序代理和RootViewController都具有managedObjectContext屬性。

在應用程序委託的 applicationDidFinishLaunching:...方法

現在添加代碼,以使它看起來像:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // Override point for customization after application launch. 
    // Add the navigation controller's view to the window and display. 
    RootViewController *topVC=(RootViewController *) self.navigationController.topViewController; 
    topVC.managedObjectContext=self.managedObjectContext; 
    self.window.rootViewController = self.navigationController; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

...然後在RootViewController.m添加:

- (void)viewDidAppear:(BOOL)animated 
{ 
    NSLog(@"self.managedObjectContext = %@",self.managedObjectContext); 
    [super viewDidAppear:animated]; 
} 

當你運行測試程序的RootViewController對象會記錄它的managedObjectContext屬性類似於:

2011-07-19 09:24:05.193 CDNavTemplate[3203:207] self.managedObjectContext = <NSManagedObjectContext: 0x4d318a0> 

...證明RootViewController對象具有來自應用程序委託的託管對象上下文。

現在,您只需重複每個視圖控制器的過程,您將其推入導航控制器堆棧,然後將相同的託管對象上下文對象逐步遞送到視圖層次結構中。您可以完全相同的方式傳遞任何其他類型的對象。

Apple建議使用依賴注入,因爲它使代碼更加模塊化,並且可以輕鬆在單個應用程序中使用多個託管對象上下文。您只需在特定時間向每個特定視圖控制器傳遞它所需的特定上下文。

+0

這對我來說非常有價值,我一直在尋找所有書籍和文檔中的這樣的解釋,但是找不到它。謝謝你 - 你做了我的一天! – Otto64

+0

編寫文檔和書籍的人通過理解API,很難讓他們理解混淆新手的東西。這是訓練領域的大問題。我必須一直處理它。 – TechZen

+0

先生,甜蜜的,神奇的解釋。 – nmdias

1

總之,有兩個選項:

  1. 這兩種(FetchedResultsController和ManagedObjectContext)的需要在其中所有視圖控制器可以訪問它們的位置。例如,如果它們位於App Delegate中(默認情況下Xcode放置了ManagedObjectContext),則可以用這種方式訪問​​它(這將顯示警告 - 因此您需要將委託鍵入到應用程序的應用程序委託類中) :
NSManagedObjectContext *context = [[[UIApplication sharedApplication] delegate] managedObjectContext];
  1. 當你創建它們其實你可以將這些值傳遞到您的視圖控制器。例如,你可以創建一個子類(比如DataViewController或者其他類),並且在這個子類上有兩個屬性(對於ManagedObjectContext和FetchedResultsController),當你創建它們的時候會設置它們。
+0

您不應該將提取的結果控制器從視圖控制器傳遞到視圖控制器,因爲FRC是特定於每個tableview的。每個tableview應該有它自己的FRC。 – TechZen

相關問題