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