Как передать managedObjectContext из appDelegate первому ViewController, когда они являются контроллером навигации между двумя представлениями - PullRequest
3 голосов
/ 17 марта 2012

Я уже три дня бьюсь головой об клавиатуру, исследуя и пытаясь понять, как я могу решить следующую проблему.

У меня есть доска для историй, которая выглядит следующим образом:

Начальная стрелка запуска приложения -> к контроллеру навигации -> к контроллеру основного вида.

Мой appDelegate создает managedObjectContext и заполняет некоторые объекты данными (для целей тестирования только atm, он будет удален, как только я буду готов к интеграции с внешним источником).Это отлично работает.Теперь моя проблема в том, что я не знаю, как я могу передать MOC из appDelegate моему первому ViewController, потому что контроллер Navigation находится в пути.Мой текущий код в методе appDidFinish выглядит следующим образом:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    // Pass the managed object context to the root view controller
    MainMenuViewController *rootView = (MainMenuViewController *)self.window.rootViewController;
    rootView.managedObjectContext = self.managedObjectContext; 

    //My actual Core data setup and adding data to it, it works I've tested it.

    return YES;
     }

Теперь мой код работает, когда я изменяю, где стрелка запуска приложения в раскадровке указывает на мой mainMenuViewController, но, тем не менее, я теряю панель навигацииво всех моих взглядах.Я также знаю, как передать MOC из моего главного меню в другое представление через - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender, но я просто не могу понять, как сделать первоначальный переход от appDelegate к MainViewController из-за того, что проклятый контроллер навигации находится вмежду ними.

Я уже искал многочисленные темы на этом сайте (и других), и я нашел решение только для "приложения с вкладками", и другие хотят, чтобы я сериализовал объект, но для моегоцели я не могу этого сделать.(только несколько представлений получат MOC, а другие будут передавать данные, которые было создано и изменено одним представлением для адаптации к конкретным целям в уникальных представлениях)

Любая помощь этому узлу в iOS и Objective-Cочень ценится.Заранее спасибо.

РЕДАКТИРОВАТЬ: я получаю сообщение об ошибке "Завершение приложения из-за необработанного исключения ... [UINavigationController setManagedObjectContext] нераспознанный селектор отправлен в экземпляр ...

Ответы [ 3 ]

10 голосов
/ 17 марта 2012

Если вы создадите новое приложение из шаблона приложения «Master-Detail» в Xcode 4.3 (и, я думаю, также и в 4.2) с установленными параметрами «Использовать раскадровку» и «Использовать основные данные», вы найдетеследующее в AppDelegate.m:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
    MasterViewController *controller = (MasterViewController *)navigationController.topViewController;
    controller.managedObjectContext = self.managedObjectContext;
    return YES;
}

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

2 голосов
/ 13 марта 2016

Если NSManagedObjectContext был установлен в AppDelegate, вы не передадите его; скорее, вы создаете ссылку на него:

AppDelegate *appDel = [UIApplication sharedApplication].delegate;   
NSManagedObjectContext *context = appDel.managedObjectContext;

Тип объекта, на который вы ссылаетесь, не имеет значения, как и любой другой тип объекта между принимающим объектом и AppDelegate.

0 голосов
/ 21 декабря 2016

В дополнение к моему первому ответу, который по сути совпадает с принятым ответом - за исключением того, что с моим вы можете использовать его с любым шаблоном или без него (а не только с шаблоном разделенного представления) - я предоставляюответ, который еще более прямо отвечает на ваш вопрос, и как передать ссылку на ваш объект диспетчера контекста в контроллер представления назначения после перехода.

Этот ответ, как и мой первый (и в отличие от принятогоответ) предполагает, что вы по крайней мере знаете, где находится контекст управляемого объекта в вашем приложении, и что у вас есть базовые навыки, необходимые для создания ссылки на него (в отличие от принятого ответа, который предполагает, что вы не можете использовать Find ...в XCode также вы не можете вспомнить, как назначить значение указателю, например:

id moc = [reference to the managed object context object that you can find]

Так как вы, кажется, лучше реагируете на ответы, которые включают шаблон, попробуйте переопределение метода prepareForSegue, предоставленное вПодкласс UIViewController в шаблоне Single Application View. Внутри вы заметите парукомментариев, оставленных Apple.

Короче говоря, вы создадите ссылку на целевой контроллер вида следующим образом:

SecondVC *vc2 = segue.destinationController;

Затем вы установите значение указателя ссылки наПеременная контекста управляемого объекта в контроллере представления назначения со значением точки привязки к нему, где бы ни был создан экземпляр:

vc2.mbo = AppDelegate.mbo;

Я привел очень подробный пример (с демонстрацией видео) создания сегментов безраскадровки (то есть программно) по адресу:

Установить идентификатор segue программно

Кстати, если у вас возникли трудности с пониманием использования ссылки AppDelegate в моемответ, я объясню это:

  1. Apple помещает свою ссылку на контекст управляемого объекта Core Data в AppDelegate.h / .m всякий раз, когда вы создаете новый проект с использованием любого шаблона XCode, а также проверяетефлажок «Использовать данные кода» во время настройки шаблона.Чтобы использовать эту ссылку во всем приложении (т. Е. В других файлах .m, и таким образом вы случайно не создадите несколько ее экземпляров), вы создаете глобальную ссылку для всего приложения на AppDelegate, которая является делегатом UIApplication., который является одноэлементным, что делает AppDelegate также одноэлементным, просто добавляя его в каждый файл реализации, в котором вы собираетесь ссылаться на контекст управляемого объекта:

    import "AppDelegate.h"

    define AppDelegate ((AppDelegate *) [[UIApplication sharedApplication] делегат])

Теперь вы получаете доступ к объекту контекста управляемого объекта везде, где добавляются эти две строки:

[AppDelegate.mbo...];
...