如何在导航控制器层次结构中返回时触发viewWillAppear?

时间:2010-11-21 21:41:52

标签: iphone objective-c ios uinavigationcontroller viewwillappear

我一直在尝试使用各种方法在返回到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的事情?

这是应用程序的笔尖..它是一个UITabBarController,每个选项卡都有一个导航控制器,在其中是UINavigationController的第一页。这个设置是不触发方法的原因吗?

alt text

这里没有显示底部的UIView,它链接到文件所有者的视图。为了使它更复杂,MainViewController实际上是实用程序式应用程序的另一面。

1 个答案:

答案 0 :(得分:0)

只是说我用另一种方式解决了这个问题。我需要调用类似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被取消的方式肯定有些奇怪。