Как передать NSManagedObjectContext через XIB Интерфейсного Разработчика - PullRequest
1 голос
/ 03 марта 2011

У меня есть простое приложение для iOS с одним UIViewController под UINavigationController.UIViewController имеет IBOutlet для NSManagedObjectContext.

В AppDelegate есть IBOutlet для контроллера nav, но нет контроллера представления.Контроллер представления автоматически создается в виде процесса XIB (как дочерний элемент контроллера nav).

При этой настройке как можно чисто назначить или передать NSManagedObjectContext делегата приложения свойству IBOutlet контроллера представления.На этом пути есть навигационный контроллер :) и у делегата приложения нет прямого свойства для UIViewController.

Это странная проблема, я хочу связать свойство одного компонента XIB ссвойство другого компонента.Большая часть работы XIB, которую я сделал, берет свойство и указывает его на объект в XIB, который, в свою очередь, - создается как обычный процесс, но в этом случае контекст создается правильно в делегате приложения, я просто хочупередать его контроллеру представления, когда он его создаст.

Ответы [ 3 ]

0 голосов
/ 03 марта 2011

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

Вот как application:didFinishLaunchingWithOptions: выглядит в одном из моих проектов Core Data.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{        
    LocationsViewController *lvc = (LocationsViewController *)self.navigationController.topViewController;
    lvc.managedObjectContext = self.managedObjectContext;
    assert(lvc.managedObjectContext != nil);
    [self.window addSubview:self.navigationController.view];
    [self.window makeKeyAndVisible];

    return YES;
}

Вы увидите, что я также начинаю с UINavigationController с одним контроллером корневого представления.

0 голосов
/ 05 марта 2011

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

Добавьте розетку в делегат приложения для вашего корневого контроллера представления и подключите его.Затем делегат приложения может дать контроллеру ссылку на контекст управляемого объекта.

Что касается вашего вопроса о нескольких контроллерах представления, мне интересно, какое реальное приложение может иметь контроллер представления (A), которыйнужны данные, загрузить другой контроллер представления (B), которому не нужны никакие данные, а затем третий (C), который снова нуждается в данных?Реалистичный пример может помочь, если он у вас есть.

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

0 голосов
/ 03 марта 2011

Вам не нужно передавать его, просто возьмите его из делегата приложения, как требуется:

#import "MyAppDleegate.h"

NSManagedObjectContext* moc = [(MyAppDelegate*)[UIApplication sharedApplication].delegate managedObjectContext];
...