Как мне сослаться на managedObjectContext в моем делегате приложения из моего контроллера представления?

Я знаю, что есть и другие вопросы по этой теме, но, похоже, ни один из них не соответствует тому, что я испытываю, отсюда и новый вопрос.

У меня есть приложение, которое является UITabBarController, я определил два подпредставления

Обе вкладки имеют свой атрибут Class в Identity Inspector, для которого установлено значение UINavigationController.

Оба подпредставления относятся к классу UIViewController и содержат объекты MKMapView.

Я пытаюсь интегрировать Core Data с целью, чтобы я мог использовать Core Data для хранения информации об объекте, который я хочу разместить на карте.

У меня мой UITabBarController определен как rootController в моем заголовочном файле Delegate. У меня также определены свойства managedObjectModel, managedObjectContext и persistentStoreCoordinator.

В реализации Delegate у меня есть стандартные методы доступа для вышеуказанных свойств, и у меня есть rootController, определенный следующим образом:

- (void)applicationDidFinishLaunching:(UIApplication *)application {

[window addSubview:rootController.view];
[window makeKeyAndVisible];

}

В моих контроллерах представлений для дочерних представлений я определил свой managedObjectContext и синтезировал его.

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

В методе applicationDidFinishLaunching я пробовал следующее:

firstView.managedObjectContext = self.managedObjectContext;

Но я получаю следующую ошибку:

Accessing unknown 'setManagedObjectContext:' class method

Может ли кто-нибудь помочь мне разобраться в этом?

Спасибо


Обновлять:

Чтобы добавить к своему вопросу, я остановлюсь на некоторых ответах, предоставив более подробную информацию

У меня есть объявление @Class в моем файле appdelegate.h. У меня есть инструкция #import в моем файле appdelegate.m для файла firstView.h. Я объявил свой firstView следующим образом в моем файле appdelegate.h

FirstView *firstView;

person conorgriffin    schedule 15.02.2010    source источник
comment
Собственно, я обнаружил опечатку. Я ссылался на класс, а не на экземпляр в моем операторе firstView.managedObjectContext. Теперь компилируется без ошибок. Спасибо @ Gerry3   -  person conorgriffin    schedule 15.02.2010
comment
Да, тот факт, что сообщение об ошибке, которое вы получали, было указанием метода класса, было странным, поэтому мне было интересно, как вы используете класс, а не его экземпляр. Рад, что у тебя все получилось.   -  person gerry3    schedule 15.02.2010


Ответы (2)


Как firstView объявляется и назначается?

Это должна быть ссылка на объект со свойством с именем «managedObjectContext».

person gerry3    schedule 15.02.2010
comment
Firstview - это uiviewcontroller. Mamagedobjectcontext - это свойство uiviewController - person conorgriffin; 15.02.2010
comment
@ Gerry3 Вы имели в виду, как это определяется в делегате? - person conorgriffin; 15.02.2010
comment
Да, он объявлен как UIViewController или правильно как ваш собственный подкласс UIViewController, у которого действительно есть свойство? - person gerry3; 15.02.2010
comment
@ Gerry3 Ну, единственная ссылка на мой код FirstView - через объявление @Class в заголовке делегата. Нужно ли мне импортировать файл заголовка из FirstView, чтобы иметь возможность ссылаться на его свойство managedObjectContext? - person conorgriffin; 15.02.2010
comment
Хммм, раньше передо мной не было исходного кода @ Gerry3. Я уже импортировал свой файл firstView.h в файл реализации делегата. Есть другие идеи? - person conorgriffin; 15.02.2010
comment
Объявлен ли firstView как UIViewController или как ваш собственный подкласс? Должно быть последнее. Можете ли вы отредактировать свой вопрос и опубликовать дополнительный код (например, заголовок делегата приложения)? - person gerry3; 15.02.2010

У меня возникла такая же проблема, поделюсь своим решением.

Сначала вам понадобится ссылка на Nav Controller на панели вкладок в файле пера, убедитесь, что вы подключили его.

IBOutlet UINavigationController *navigationController;

Затем получите контроллер, как рекомендовано в документации поддержки, и отправьте ему managedObjectContext:

SavedTableViewController *saved = (SavedTableViewController *)[navigationController topViewController];
saved.managedObjectContext = self.managedObjectContext;

Алекс (из другого сообщения) прав: «Как правило, вам следует избегать получения общих объектов от делегата приложения. Это заставляет его вести себя слишком похоже на глобальную переменную, и с этим связано множество проблем».

person W Dyson    schedule 05.02.2011
comment
Если вы используете только один контроллер представления для изменения объектов, а другие контроллеры представления - для просмотра, тогда совместное использование объектов не является большой проблемой? - person conorgriffin; 05.02.2011
comment
У вас есть хорошая идея, но что, если в будущем вы добавите еще один контроллер представления, который также будет обращаться к нему? Или вы хотите реструктурировать свое приложение? Этот метод больше предназначен для проверки будущего и гарантирует, что вы не столкнетесь с ненужными проблемами в будущем. Компакт-диск был предназначен для делегата приложения, чтобы передать контекст контроллеру, а не наоборот. Это не моя идея об идеальной реализации, но это то, что рекомендовали инженеры, просто передавая сообщение ... - person W Dyson; 05.02.2011