Получение UITabBarController для работы с Core Data - PullRequest
1 голос
/ 26 мая 2011

Я читал эту ветку в Stackoverflow и безуспешно пытался воспроизвести решение в моем собственном проекте.

В моем проекте 4 вкладки. В моем приложении-делегате я делаю это:

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


    Page1 *page1 = (Page1 *)[navController topViewController];
    Page2 *page2 = (Page2 *)[navController topViewController];
    Page3 *page3 = (Page3 *)[navController topViewController];
    Page4 *page4 = (Page4 *)[navController topViewController];

    page1.managedObjectContext = self.managedObjectContext;
    page2.managedObjectContext = self.managedObjectContext;
    page3.managedObjectContext = self.managedObjectContext;
    page4.managedObjectContext = self.managedObjectContext;


    [self.window makeKeyAndVisible];

    return YES;
}

В исходном потоке говорится, что мне нужно создать IBOutlet для каждого navController для каждой вкладки, на которой я хочу использовать данные Core.

Хотя вы можете назначить несколько делегатов для UINavigationController, то же самое не относится к розеткам, вы всегда можете предоставить только ОДНУ розетку для navController.

Я могу заставить Page1 работать, но другие страницы просто падают; из-за отсутствия IBOutlet.

Мне действительно нужны X IBOutlets для вкладок Y или я могу сделать это по-другому?

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

В идеале вы хотите передать либо NSManagedObjectContext, NSFetchedResultsController или соответствующий NSManagedObject "вниз" в UIViewController.

Но нет кода или примера того, как это сделать.

В идеале я не хочу использовать сингелтон или делегат приложения повсюду.

Любое подтверждение и уточнение было бы замечательно.

Спасибо.

1 Ответ

2 голосов
/ 27 мая 2011

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

Шаблон, рекомендуемый в вопросе, на который вы ссылаетесь, называется «внедрение зависимостей», и в большинстве случаев Apple рекомендует его. Однако, в случае панелей вкладок или любой другой сложной иерархии представления / контроллера представления, внедрение зависимости может усложниться. Это особая проблема с панелями вкладок, потому что вы обычно не загружаете все представления / контроллеры вкладок при запуске приложения, а ждете, пока каждая вкладка не будет выбрана, прежде чем загружать ее элементы.

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

(MyApplicationDelegate *) appDelegate=(MyApplicationDelegate *)[[UIApplication sharedApplication] delegate];

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

theManagedObjectContext=appDelegate.managedObjectContext

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...