Проблемы с передачей managedObjectContext в UITabBarController

#iphone #core-data #uitabbarcontroller

#iPhone #core-data #uitabbarcontroller

Вопрос:

Я создаю приложение для iPhone на основе Core Data, в котором хранятся некоторые данные.

У него есть UITabBarController в качестве корневого контроллера представления ( RootViewController ). Делегат приложения предоставляет контроллеру панели вкладок два контроллера просмотра — первый является экземпляром, UIViewController который представляет экран заголовка приложения, а второй является UITableViewController , который используется для отображения данных.

Это мое первое приложение для iPhone, использующее Core Data. Я читал, что правильный способ создания приложений такого типа — создать и инициализировать объекты managedObjectModel , managedObjectContext и persistentStoreCoordinator в делегате приложения, а затем передать managedObjectContext дочерним контроллерам представления по ссылке. Вот как я это сделал.

Однако мне не удалось передать managedObjectContext объект в контроллер панели вкладок, который я инициализирую в делегате моего приложения applicationDidFinishLaunching:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:    (NSDictionary *)launchOptions {
    RootViewController *rootViewController = [[RootViewController alloc] init];
    rootViewController.managedObjectContext = self.managedObjectContext;
    [window addSubview:rootViewController.view];
    [window makeKeyAndVisible];
    [rootViewController release];
    return YES;
}
  

Несмотря на то, что панель вкладок отображается правильно и загружает контроллер просмотра экрана заголовка, его managedObjectContext значение остается нулевым. Я не смог понять, что я делаю не так. Я также попытался передать RootViewController строку a, добавив к ней новое сохраненное свойство.

Мой RootViewController.h выглядит следующим образом:

 @interface RootViewController : UITabBarController {
@private 
NSManagedObjectContext *managedObjectContext;
}

@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;

@end
  

Метод viewDidLoad моего RootViewController от RootViewController:

 - (void)viewDidLoad {
[super viewDidLoad];

NSLog(@"%@", self.managedObjectContext);

ObiadViewController *obiadVC = [[ObiadViewController alloc] init];
ObiadListNavController *obiadListVC = [[ObiadListNavController alloc] init];

obiadVC.managedObjectContext = self.managedObjectContext;
obiadListVC.managedObjectContext = self.managedObjectContext;

NSArray *vcs = [NSArray arrayWithObjects:obiadVC, obiadListVC, nil];

self.viewControllers = vcs;

[obiadVC release];
[obiadListVC release];
  

}

Я также проверил, что managedObjectContext значение не равно нулю в делегате приложения, непосредственно перед его передачей в RootViewController экземпляр. Похоже, что все RootViewController ивары сбрасываются. Это происходит только на этом этапе. Когда позже я передаю строку из контроллера табличного представления в контроллер подробного представления, все просто отлично.

Надеюсь, я ясно выразился. На данный момент я чувствую себя довольно невежественным.

Комментарии:

1. Что выводит NSLog (@»% @», self.managedObjectContext); в вашем TabBarController.m? ЕСЛИ это nil, вы фактически переводите свой managedObjectContext в nil. Не должно obiadVC.managedObjectContext = self.managedObjectContext; быть obiadVC.managedObjectContext = self.delegate.managedObjectContext; ?

2. не RootViewController *rootViewController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil] вместо простого выделения / инициализации?;

Ответ №1:

В ссылке на класс UITabBarController четко указано, что UITabBarController не должен быть подклассом:

Этот класс не предназначен для создания подклассов.

В этом случае вы могли бы создать экземпляр вашего UITabBarController и добавить к нему контроллеры просмотра в applicationDidFinishLaunching делегата вашего приложения:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    tabBarController = [[UITabBarController alloc] init];

    FirstViewController *firstViewController = [[FirstViewController alloc] init];
    SecondViewController *secondViewController = [[SecondViewController alloc] init];

    firstViewController.managedObjectContext = self.managedObjectContext;
    secondViewController.managedObjectContext = self.managedObjectContext;

    NSArray *vcs = [NSArray arrayWithObjects:firstViewController, secondViewController, nil];
    tabBarController.viewControllers = vcs;

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

    [firstViewController release];
    [secondViewController release];

    return YES;
}
  

Надеюсь, это поможет.

Комментарии:

1. Как бы вы это сделали с помощью storyboard? Потому что у вас нет доступа к вашим контроллерам просмотра программно, или, скорее, в этом нет необходимости.