У меня есть приложение для 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, созданный в делегате приложения, но я не знаю, как продолжить двигаться (даже читающий весь хороший комментарий относительно темы здесь и здесь):
Я предполагаю, что не понимаю достаточно хорошо, как работать с UITabBarController.
В идеале вы хотите пройти либо NSManagedObjectContext
, NSFetchedResultScontroller
или соответствующую NSManageObject
«вниз» в UIViewController
. Это позволяет «родительскому» контролировать «ребенок» и определить, чего должен иметь ребенок. Это создает более слабо связанный дизайн и позволяет легко повторно договориться UiviewController
экземпляров по мере необходимости. Это также облегчает повторное использование UiviewController
.
На вкладке Просмотр дизайна это не отличается. Ваш AppDelegate проходит nsmanageObjectContext
, к тому, кто несет ответственность за создание исходных экземпляров UIViewController
, которые переходят в UitabbarController
. В свою очередь, что создатель проходит соответствующую информацию ( NSManageCoundObject
, NSFetchedResultSconTroller
, и / или экземпляры NSMANALDOBJECT
) в UIViewController
экземпляры, как это построить их.
Хорошо, я выглядел долго и тяжело в приложении образца COREDatabooks и сделал это так:
добавили следующий код в ApplicationDIDFINISHLAUCHING
:
// Передайте контекст управляемого объекта к контроллерам просмотра
Rootviewcontroller * rootviewcontroller = (rootviewcontroller *) [NavipateController TopViewController];
RootViewController.ManageObjectContext = Self.ManageObjectContext;
mapviewcontroller.manageobjectcontext = self.manageObjectcontext;
И теперь он работает как очарование.
Более прямое решение - сделать менеджедроуjectcontext вашего общественного свойства Delegate приложений, поэтому, куда бы вам нужен доступ к нему, вы сделаете следующее:
[[[UIApplication sharedApplication] delegate] sharedManagedObjectContext];
Предполагая, что SharedManageObjectObjectContext Это имя свойства.
Если вы хотите использовать метод впрыска зависимостей для передачи контекста управляемого объекта с помощью контроллера вкладок, более прочный раствор будет зависать на всех контроллерах представления в ApplicationDIDFINISHLAUCHING
:
for (id vc in tabBarController.viewControllers) {
[vc setManagedObjectContext:self.managedObjectContext];
}
Использование Xcode 3.2.1 и таргетинг на 3.1.3 У меня были бесконечные проблемы с подходом
rootViewController.managedObjectContext = self.managedObjectContext;
, который описывает mvexcel (и что он используется во всех примерах приложений), но с использованием точно такого же подхода, но с формулировкой. как:
[rootViewController setManagedObjectContext:self.managedObjectContext];
работает отлично.
У меня также было много проблем с некорректной синхронизацией построителя интерфейсов с Xcode и невозможностью подключить выходы для передачи контекста. Надеюсь, следующий выпуск исправит все это.