返回导航控制器层次结构时如何触发viewWillAppear?
Posted
技术标签:
【中文标题】返回导航控制器层次结构时如何触发viewWillAppear?【英文标题】:How to trigger viewWillAppear when going back in the navigation controller hierarchy? 【发布时间】:2010-11-21 21:41:51 【问题描述】:当返回到 UINavigationController 的第一级时,我一直在尝试各种方法来触发一些代码,但以下都不起作用...
// HomeViewController.m
-(void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
NSLog(@"trigger 1");
- (void)viewWillAppear:(BOOL)animated
NSLog(@"trigger 2");
-(void) viewDidAppear:(BOOL)animated
NSLog(@"trigger 3");
我开始认为我的应用程序设置错误了。是因为在 UIViewControllers 中包含 UIViewControllers 吗?
这是应用程序的 nib。它是一个 UITabBarController,每个选项卡都有一个导航控制器,并且在 UINavigationController 的第一页内。这个设置是方法没有触发的原因吗?
未显示的是底部的 UIView,它链接到文件所有者的视图。更复杂的是,MainViewController 实际上是 Utility 风格的应用程序的另一面。
【问题讨论】:
【参考方案1】:只是说我用另一种方式解决了这个问题。我需要调用 viewWillAppear 之类的东西,因为当我的第二个视图发生变化时,我需要更新我的第一个视图表。
我实现它的方法是,在我的 'tableView: commitEditingStyle' 方法(在我删除某些内容后调用)中,我把它放在最后..
[[[[self.navigationController.tabBarController.viewControllers objectAtIndex:0] viewControllers] objectAtIndex:0] reloadTheTable];
reloadTheTable 是我的 HomeViewController 中的一个方法,它执行更新数组和 [tableView reloadData] 等操作;
这是很多括号。我确信我的笔尖可以设置为更简单。我认为卡斯帕罗夫说过他认为前进四步……而四个括号是我的极限。
我通过以下方式解决了这个问题:
NSString *name = NSStringFromClass ([[self parentViewController] class]);
NSLog(@"%@", name); // outputs UINavigationController
然后慢慢添加,直到找到我要找的东西:
name = NSStringFromClass ([[[[self.navigationController.tabBarController.viewControllers objectAtIndex:0] viewControllers] objectAtIndex:0] class]); //UINavigationController
NSLog(@"%@", name); // outputs HomeViewController
当您将视图放在视图中时,viewWillAppear 被取消的方式肯定有些奇怪。
【讨论】:
你什么时候打电话的?在弹出现有的视图控制器之前?以上是关于返回导航控制器层次结构时如何触发viewWillAppear?的主要内容,如果未能解决你的问题,请参考以下文章