我的RootViewController包含一個簡單的表視圖。選擇表中的一個條目後,DetailViewController會顯示更多關於所選條目的詳細信息。相關數據對象的數據通過CoreData加載並保存。如何將FetchedResultsController和ManagedObjectContext傳遞給didSelectRowAtIndexPath方法中的DetailViewController? 我是否需要在DetailViewController.h中定義兩者的屬性?你能給我提供一個代碼示例嗎?在多個視圖控制器中使用FetchedResultsController和ManagedObjectContext
回答
首先,每個獲取的結果控制器(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建議使用依賴注入,因爲它使代碼更加模塊化,並且可以輕鬆在單個應用程序中使用多個託管對象上下文。您只需在特定時間向每個特定視圖控制器傳遞它所需的特定上下文。
總之,有兩個選項:
- 這兩種(FetchedResultsController和ManagedObjectContext)的需要在其中所有視圖控制器可以訪問它們的位置。例如,如果它們位於App Delegate中(默認情況下Xcode放置了ManagedObjectContext),則可以用這種方式訪問它(這將顯示警告 - 因此您需要將委託鍵入到應用程序的應用程序委託類中) :
NSManagedObjectContext *context = [[[UIApplication sharedApplication] delegate] managedObjectContext];
- 當你創建它們其實你可以將這些值傳遞到您的視圖控制器。例如,你可以創建一個子類(比如DataViewController或者其他類),並且在這個子類上有兩個屬性(對於ManagedObjectContext和FetchedResultsController),當你創建它們的時候會設置它們。
您不應該將提取的結果控制器從視圖控制器傳遞到視圖控制器,因爲FRC是特定於每個tableview的。每個tableview應該有它自己的FRC。 – TechZen
- 1. AngularJS多個視圖和控制器
- 2. 在單個視圖控制器中使用多個nib文件?
- 3. 如何在多個視圖控制器中使用一個xib?
- 4. 在頁面控制器中訪問多個視圖控制器
- 5. 在視圖和控制器使用ASP.NET
- 6. 在容器視圖中嵌入多個視圖控制器
- 7. 在單一視圖控制器中切換多個視圖控制器iOS
- 8. 如何在多個視圖控制器中使用GameCenterManager
- 9. 如何在控制器/視圖mvc中使用多個模型?
- 10. 在多個視圖控制器中使用代理
- 11. 在自定義視圖和視圖控制器中使用AutoLayout
- 12. 多控制器在一個視圖
- 13. iAd在多個視圖控制器上
- 14. 有多少視圖控制器太多視圖控制器?
- 15. mvc替代多個視圖和控制器使用if-else
- 16. 在單個視圖控制器上使用多個TableView
- 17. 在視圖控制器中的多個可能的視圖
- 18. Xcode TabBar控制器中的Tab的多個視圖控制器
- 19. 多個導航控制器中的視圖控制器通信
- 20. 在視圖控制器內添加多個導航控制器?
- 21. 多個控制器從一個視圖
- 22. iPhone一個控制器,多個視圖
- 23. 如何在很多領域使用控制器和視圖
- 24. 如何在一個視圖中引用多個控制器(CakePHP)
- 25. 使用視圖控制器既作爲模式視圖控制器和作爲標籤欄視圖控制器
- 26. 用於iPhone上單個視圖的多個視圖控制器
- 27. 如何通過ManagedObjectContext到根視圖控制器迅速
- 28. MonoTouch使用視圖和控制器
- 29. 在一個視圖控制器上的多個集合視圖
- 30. 在視圖控制器中使用導航控制器
這對我來說非常有價值,我一直在尋找所有書籍和文檔中的這樣的解釋,但是找不到它。謝謝你 - 你做了我的一天! – Otto64
編寫文檔和書籍的人通過理解API,很難讓他們理解混淆新手的東西。這是訓練領域的大問題。我必須一直處理它。 – TechZen
先生,甜蜜的,神奇的解釋。 – nmdias