Я создаю свои Nav и TabBar в коде при запуске через: IN: myAppDelegate.m
- (void)applicationDidFinishLaunching:(UIApplication *)application {
// set up a local nav controller which we will reuse for each view controller
UINavigationController *localNavigationController;
// create tab bar controller and array to hold the view controllers
tabBarController = [[UITabBarController alloc] init];
NSMutableArray *localControllersArray = [[NSMutableArray alloc] initWithCapacity:4];
// setup the first view controller (Root view controller)
RootViewController *myViewController;
myViewController = [[RootViewController alloc] initWithTabBar];
// create the nav controller and add the root view controller as its first view
localNavigationController = [[UINavigationController alloc] initWithRootViewController:myViewController];
// add the new nav controller (with the root view controller inside it)
// to the array of controllers
[localControllersArray addObject:localNavigationController];
// release since we are done with this for now
[localNavigationController release];
[myViewController release];
// setup the first view controller just like the first
ResortsListViewController *resortsListViewController;
resortsListViewController = [[ResortsListViewController alloc] initWithNibName:@"ResortsListView" bundle:nil];
resortsListViewController.title = @"Category1";
resortsListViewController.tabBarItem.image = [UIImage imageNamed:@"image1.png"];
resortsListViewController.navigationItem.title=@"Category1";
localNavigationController = [[UINavigationController alloc] initWithRootViewController:resortsListViewController];
[localControllersArray addObject:localNavigationController];
[localNavigationController release];
// setup the second view controller just like the first
ResortsListViewController *resortsListViewController;
resortsListViewController = [[ResortsListViewController alloc] initWithNibName:@"ResortsListView" bundle:nil];
resortsListViewController.title = @"Category2";
resortsListViewController.tabBarItem.image = [UIImage imageNamed:@"image2.png"];
resortsListViewController.navigationItem.title=@"Category2";
localNavigationController = [[UINavigationController alloc] initWithRootViewController:resortsListViewController];
[localControllersArray addObject:localNavigationController];
[localNavigationController release];
// setup the third view controller just like the first
ResortsListViewController *resortsListViewController;
resortsListViewController = [[ResortsListViewController alloc] initWithNibName:@"ResortsListView" bundle:nil];
resortsListViewController.title = @"Category3";
resortsListViewController.tabBarItem.image = [UIImage imageNamed:@"image3.png"];
resortsListViewController.navigationItem.title=@"Category3";
localNavigationController = [[UINavigationController alloc] initWithRootViewController:resortsListViewController];
[localControllersArray addObject:localNavigationController];
[localNavigationController release];
[resortsListViewController release];
// load up our tab bar controller with the view controllers
tabBarController.viewControllers = localControllersArray;
// release the array because the tab bar controller now has it
[localControllersArray release];
// add the tabBarController as a subview in the window
[window addSubview:tabBarController.view];
// need this last line to display the window (and tab bar controller)
[window makeKeyAndVisible];
}
Как видите, я повторно использую ResortsListViewController для отображения различных категорий (курорты с пляжами, курорты с бассейнами, курорты с эспрессо-барами)... теперь, не беспокоя меня (усмехается) глупостью моих категорий (потому что это тестовое приложение) мне нужно сделать несколько вещей:
Мне нужно знать, какая вкладка вызвала отображение ResortsListViewController. Я надеялся использовать TAG, но «initWithRootViewController» не имеет элемента управления «tag». Итак, если я использую имя файла изображения, которое является именем категории, я могу использовать это имя файла, чтобы различать категории... или даже имя элемента навигации. Мне нужно знать, есть ли у ResortsListViewController способ узнать, какой элемент панели вкладок вызвал его отображение. Я думал найти «действие», которое я мог бы назначить элементу панели вкладок, но это не так, как работает tabbarcontroller.
При переходе с одной вкладки на другую представление действительно меняется, меняется заголовок ResortsListViewController и т. д., но содержащееся в нем TABLEVIEW не очищается и не отображает никаких новых данных. Поискав в Интернете, я нашел возможное решение:
http://discussions.apple.com/thread.jspa?threadID=1529769&tstart= 0а>
в основном говоря:
Чтобы UINavigationControllers мог отправлять сообщения «viewWill/Did/Appear/Disappear», он должен получить «viewWill/Did/Appear/Disappear» из своего контейнера.
Каков контейнер для моих UINavigationControllers в этой ситуации? myAppDelegate определен в файле .h как:
NSObject <UIApplicationDelegate, CLLocationManagerDelegate>
и не имеет:
- (void)viewWillAppear:(BOOL)animated {
}
раздел. Когда я добавляю один, он говорит: «NSObject может не отвечать на -viewWillAppear» в отладчике.
Любая помощь там?