Как обзор, у меня есть проблемы с UINavigationController в UITabBarController, звоня viewWillAppear каждый раз, когда представление выталкивается от стека.
От делегата UITabBarController сделан программно:
// Create views for Tab Bar
UINavigationController *view1 = [[UINavigationController alloc] initWithRootViewController:[[newsFeedNavigationController alloc] initWithStyle:UITableViewStylePlain]];
resizedTabBatItem *tabBarItem1 = [[resizedTabBatItem alloc] initWithTitle:nil image:[UIImage imageNamed:@"newspaper.png"] tag:0];
[view1 setTabBarItem:tabBarItem1];
[tabBarItem1 release];
UIViewController *view2 = [UIViewController new];
resizedTabBatItem *tabBarItem2 = [[resizedTabBatItem alloc] initWithTitle:nil image:[UIImage imageNamed:@"speechbubble.png"] tag:1];
[view2 setTabBarItem:tabBarItem2];
[tabBarItem2 release];
....
// Create the tab bar controller
bookTabBarController = [BookTabBarController new];
[[bookTabBarController view] setFrame:CGRectMake(0, 0, 320, 460)];
// Add the views to it
NSArray *viewControllers = [NSArray arrayWithObjects:view1, view2, view3, view4, view5, nil];
[[bookTabBarController tabBarController] setViewControllers:viewControllers];
Моим newsFeedNavigationController является просто разделенный на подклассы UITableViewController (и подкласс не вмешивается в viewWillAppear, поскольку это никогда не называют в newsFeedNavigationController). В нем, объекты, которые при нажатии продвинут новый UIViewController в стек.
Проблема состоит в том, что каждый раз, когда представления выталкиваются от стека, viewWillAppear никогда не называют в newsFeedNavigationController, и объекты в списке остаются выделенными. Я смешивал с этим в течение нескольких часов, в точке, где я нуждаюсь в некоторой помощи для обнаружения то, что я делаю неправильно.
В моем newsFeedNavigationController я пытался добавить NSLog, чтобы видеть, называют ли это, или я сделал что-то, но это даже не называют.
- (void)viewWillAppear:(BOOL)animated {
NSLog(@"is viewWillAppear called?");
[super viewWillAppear:animated];
}
Править:
Хорошо, теперь вот что-то странное, которое я заметил:
Если я работаю:
[self presentModalViewController:(any UIview) animated:YES];
и затем отклоните, это, viewWillAppear начинает работать правильно при совании и продвижении представлений... Таким образом, теперь я озадачен. Это не действительно решение, но возможно внутренняя часть чего-то, что продолжается.
Отвечая на свой собственный вопрос, я выяснил, в чем была проблема.
Чтобы соблюсти правило Apple "No UITabBarController inside of a UINavigationController", я написал свой собственный контроллер панели вкладок (bookTabBarController), который основан на стандартном контроллере представления. Моя проблема заключалась в том, что класс не передавал viewDidAppear классу, который управлял контроллерами представления, поэтому он никогда не знал, отображается он или нет.
Другое решение - установить делегата контроллера навигации. В делегате реализуйте следующий метод:
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
[viewController viewWillAppear:animated];
}
Это гарантирует, что viewWillAppear будет вызываться на любом контроллере представления, представление которого собирается появиться в контроллере навигации. Если вы сделаете это таким образом, viewWillAppear будет вызван независимо от того, появляется ли представление из-за того, что оно выталкивается, или оно появляется из-за того, что выскакивает подпредставление.