作为概述,每当从堆栈中弹出视图时,我都会遇到 UITabBarController 内的 UINavigationController 调用 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 推入堆栈的项目。
问题是,无论何时从堆栈中弹出视图,都不会在 newsFeedNavigationController 中调用 viewWillAppear,并且列表中的项目仍然突出显示。我已经搞砸了几个小时,我需要一些帮助来找出我做错了什么。
在我的 newsFeedNavigationController 中,我尝试添加一个 NSLog 以查看它是否被调用或者我做了什么,但它甚至从未被调用过。
- (void)viewWillAppear:(BOOL)animated {
NSLog(@"is viewWillAppear called?");
[super viewWillAppear:animated];
}
编辑:
好的,现在我注意到了一些奇怪的事情:
如果我运行:
[self presentModalViewController:(any UIview) animated:YES];
然后关闭它, viewWillAppear 在弹出和推送视图时开始正常工作......所以现在我很难过。这不是一个真正的解决方案,但可能是正在发生的事情的内部。