返回导航控制器层次结构时如何触发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?的主要内容,如果未能解决你的问题,请参考以下文章

从层次结构中删除前一个视图控制器

Swift ios 重置视图控制器层次结构

ios-如何在项目中添加导航控制器?

iPhone 视图控制器层次结构的开销是多少?

稍后在导航控制器的层次结构中抓取视图

按下 UINavigationController 后如何将编辑按钮添加到 UINavigationBar