2010-08-09 3 views
2

Я хорошо встраиваю приложение 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

«Вкладка» - это просто другой контроллер. Когда вы инициируете VC для каждой вкладки, вы можете передать им контекст управляемого объекта точно так же, как вы установили rootViewController.managedObjectContext, считая, что у них есть свойства managedObjectContext.

Некоторые люди используют одноэлементные объекты для предоставления объектов Core Data своим классам; то, что я сделал в приложении, над которым я сейчас работаю, было объявить протокол CoreDataSource с помощью геттеров для моего NSManagedObjectContext, NSManagedObjectModel и NSPersistentStoreCoordinator и реализовал этот протокол на моем appDelegate. Контроллеры моего представления, которые должны использовать данные ядра, имеют переменные-члены типа NSObject <CoreDataSource>, и по мере их создания они устанавливают свойство. Они все на самом деле указывают на мой appDelegate, но они этого не знают, поэтому они не тесно связаны с восходящим объектом.

+0

Я не вижу, как/где каждый VC инициализируется для каждой вкладки. Чтобы добавить вкладку, я просто добавляю еще одну вещь под контроллером табуляции и указываю ее на VC. –

+0

Вам не нужен их init, вы можете обработать его в методе '-applicationDidFinishLaunching ... 'вашего AppDelegate. Возьмите 'UITabbarController' и перейдите по своим' -viewControllers'. –

+0

Marcus - да, я имел в виду в -applicationDidFinishLaunching - когда я использовал контроллеры вкладок, я создал и добавил вкладки вручную. В любом случае, я согласен с вами в том, что это подходящее место для DI. –

2

Самым простым решением является добавление супер класс для вас контроллеров отображения вкладки с атрибутом managedObjectContext и метод пользовательского геттерного как:

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

Если все вкладки контроллеры просмотр наследуют этот метод все они будут автоматически найти контекст управляемого объекта приложения. И вы сделали.

+1

Мы по-прежнему не согласны с использованием Singletons :) Я нахожу, что инъекция зависимостей, когда запуск приложений является лучшим решением. –

+0

@Marcus S. Zarra - Инъекционная инъекция может быть лучше, но для новичков это не проще. Я считаю, что новички испытывают проблемы с отслеживанием иерархии диспетчера представлений, и это оборачивается этой проблемой, особенно в случае вкладок. – TechZen

+0

Я всегда был поклонником удара по глубокому концу :) –

Смежные вопросы