Как совместно использовать ManagedObjectContext при использовании UITabBarController

У меня есть приложение для iPhone, которое имеет MainWindow.xib содержание UITabBarController, который в свою очередь имеет UINavigationController и пользовательский подкласс UIViewController в его массиве ViewControllers. Корневой контроллер представления для UINavigationController и пользовательский контроллер представления оба загружаются из других xib файлов.

Использование приложения базовые данные, стек инициализируется в делегате приложения (согласно конвенции).

Делегат приложения добавляет UITabBarController к окну:

- (void)applicationDidFinishLaunching:(UIApplication *)application {        
    // Configure and show the window
    [window addSubview:[tabBarController view]];
    [window makeKeyAndVisible];
}

Я понимаю, что должен распространить указатель на ManagedObjectContext, созданный в делегате приложения, но я не знаю, как продолжить двигаться (даже читающий весь хороший комментарий относительно темы здесь и здесь):

  • Я распространяю ManagedObjectContext к UITabBarController и оттуда на отдельных контроллерах представления и если так, как?
  • Или я распространяю ManagedObjectContext непосредственно к корневому контроллеру представления UINavigationController и к пользовательскому контроллеру представления и как я сделал бы это?

Я предполагаю, что не понимаю достаточно хорошо, как работать с UITabBarController.

13
задан Community 23 May 2017 в 11:53
поделиться

5 ответов

В идеале вы хотите пройти либо NSManagedObjectContext , NSFetchedResultScontroller или соответствующую NSManageObject «вниз» в UIViewController . Это позволяет «родительскому» контролировать «ребенок» и определить, чего должен иметь ребенок. Это создает более слабо связанный дизайн и позволяет легко повторно договориться UiviewController экземпляров по мере необходимости. Это также облегчает повторное использование UiviewController .

На вкладке Просмотр дизайна это не отличается. Ваш AppDelegate проходит nsmanageObjectContext , к тому, кто несет ответственность за создание исходных экземпляров UIViewController , которые переходят в UitabbarController . В свою очередь, что создатель проходит соответствующую информацию ( NSManageCoundObject , NSFetchedResultSconTroller , и / или экземпляры NSMANALDOBJECT ) в UIViewController экземпляры, как это построить их.

14
ответ дан 1 December 2019 в 21:24
поделиться
- 4746571-

Хорошо, я выглядел долго и тяжело в приложении образца COREDatabooks и сделал это так:

  • созданные Iboutlets к rootViewController (контроллер верхней точки зрения UinavigatyController) и MapViewController ( Пользовательский контроллер представления) в делегате приложения.
  • Подключаемые выходы на контроллеры просмотра в MainWindow.xib
  • добавили следующий код в ApplicationDIDFINISHLAUCHING :

     // Передайте контекст управляемого объекта к контроллерам просмотра
    Rootviewcontroller * rootviewcontroller = (rootviewcontroller *) [NavipateController TopViewController];
    RootViewController.ManageObjectContext = Self.ManageObjectContext;
    
    mapviewcontroller.manageobjectcontext = self.manageObjectcontext;
     

И теперь он работает как очарование.

1
ответ дан 1 December 2019 в 21:24
поделиться

Более прямое решение - сделать менеджедроуjectcontext вашего общественного свойства Delegate приложений, поэтому, куда бы вам нужен доступ к нему, вы сделаете следующее:

[[[UIApplication sharedApplication] delegate] sharedManagedObjectContext];

Предполагая, что SharedManageObjectObjectContext Это имя свойства.

-1
ответ дан 1 December 2019 в 21:24
поделиться

Если вы хотите использовать метод впрыска зависимостей для передачи контекста управляемого объекта с помощью контроллера вкладок, более прочный раствор будет зависать на всех контроллерах представления в ApplicationDIDFINISHLAUCHING :

for (id vc in tabBarController.viewControllers) {
    [vc setManagedObjectContext:self.managedObjectContext];
}
11
ответ дан 1 December 2019 в 21:24
поделиться

Использование Xcode 3.2.1 и таргетинг на 3.1.3 У меня были бесконечные проблемы с подходом

rootViewController.managedObjectContext = self.managedObjectContext;

, который описывает mvexcel (и что он используется во всех примерах приложений), но с использованием точно такого же подхода, но с формулировкой. как:

[rootViewController setManagedObjectContext:self.managedObjectContext];

работает отлично.

У меня также было много проблем с некорректной синхронизацией построителя интерфейсов с Xcode и невозможностью подключить выходы для передачи контекста. Надеюсь, следующий выпуск исправит все это.

0
ответ дан 1 December 2019 в 21:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: