Передача managedObjectContext к проблемам UITabBarController - PullRequest
1 голос
/ 23 апреля 2011

Я делаю приложение для 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, добавив к ней новое сохраненное свойство.

My RootViewController.h читается следующим образом:

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

@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;

@end

Метод viewDidLoad моего 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 не равен nil в делегате приложения, непосредственно перед тем, как он будет передан экземпляру RootViewController. Это похоже на сброс всех RootViewController иваров. Это происходит только в этот момент. Когда позже я передаю строку из контроллера табличного представления в контроллер подробного представления, все просто отлично.

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

1 Ответ

2 голосов
/ 23 апреля 2011

Ссылка на класс 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;
}

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

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