2010-08-09 60 views
2

我很好地構建了基於Core Data標籤的iPad應用程序。我使用我的應用程序委託類中的以下內容將NSManagedObjectContext傳遞給我的根視圖。分享NSManagedObjectContext和iphone/ipad標籤之間的其他服務類

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  
    self.rootViewController.managedObjectContext = self.managedObjectContext; 
    [window addSubview:tabBarController.view]; 
    [window makeKeyAndVisible]; 

    return YES;  
} 

我的問題是:如何在我的所有選項卡上設置相同的managedObjectContext?如果我可以在應用程序委託中設置一些服務類並在所有選項卡中使用相同的實例,那也是一件好事。如何才能做到這一點?

提前致謝!

回答

4

「tab」只是另一個視圖控制器。在爲每個選項卡啓動VC時,可以使用與設置rootViewController.managedObjectContext完全相同的方式將它們交給託管對象上下文,前提是它們具有managedObjectContext屬性。

有些人使用單例對象來爲其類提供Core Data對象;我目前在應用程序中所做的工作是爲我的NSManagedObjectContext,NSManagedObjectModel和NSPersistentStoreCoordinator聲明一個協議CoreDataSource,並在我的appDelegate上實現該協議。我需要使用核心數據的視圖控制器具有NSObject類型的成員變量<CoreDataSource>,並且當他們創建對方時,他們設置屬性。它們實際上都指向我的appDelegate,但它們不知道它,所以它們不與上游對象緊密耦合。

+0

我無法看到每個標籤的每個VC的初始化方式/位置。要添加選項卡,我只需在選項卡控制器下添加另一個選項並將其指向VC。 – 2010-08-09 06:26:17

+0

你不需要他們的init,你可以在AppDelegate的'-applicationDidFinishLaunching ...'方法中處理它。抓住'UITabbarController'並迭代它的'-viewControllers'。 – 2010-08-09 16:31:17

+0

Marcus - 是的,我的意思是在-applicationDidFinishLaunching - 當我使用標籤控制器時,我創建並手動添加了標籤。無論哪種方式,我同意你的看法,這是DI的合適地點。 – 2010-08-09 16:54:48

2

最簡單的解決方案是增加超類爲你標籤視圖控制器,帶有managedObjectContext屬性,如自定義getter方法:

- (NSManagedObjectContext *) managedObjectContext{ 
    if (managedObjectContext !=nil) { 
     return managedObjectContext; 
    } 
    MyAppDelegateClass *appDelegate=(MyAppDelegateClass *)[[UIApplication sharedApplication] delegate]; 
    self.managedObjectContext=appDelegate.managedObjectContext; 
    return managedObjectContext; 
} 

如果所有的標籤視圖控制器繼承了這個方法,他們都會自動查找應用程序委託的託管對象上下文。你完成了。

+1

我們仍然不同意使用Singletons :)我發現應用程序啓動時的依賴注入是一個更好的解決方案。 – 2010-08-09 16:30:12

+0

@Marcus S. Zarra - 依賴注入可能會更好,但新手實現起來並不簡單。我發現新手在跟蹤視圖控制器層次結構時遇到問題,並且這會解決這個問題,特別是在標籤欄的情況下。 – TechZen 2010-08-09 19:41:41

+0

我一直是第一個擊中深度的粉絲:) – 2010-08-09 21:55:36

相關問題