如何确定UINavigationControllers中的先前visibleViewController?

时间:2009-08-06 00:12:57

标签: iphone objective-c cocoa-touch

我在导航视图层次结构的上下文中切换视图,我希望能够在切换时确定在新视图下推送的先前视图是什么。

我在UINavigationControllerDelegate中尝试这个:

(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    NSLog( @"Switching from %@ to %@", 
        NSStringFromClass( [[navigationController visibleViewController] class] ),
        NSStringFromClass( [viewController class] )
    );
}

我明白了:

  

2009-08-05 20:05:21.274 App Name [85913:20b]切换自   ManagementScreen到ManagementScreen

不幸的是,在调用“will”之前,它已经在UINavigationController的状态中被换出,这样传入的viewController总是与UINavigationController上的visibleViewController相同(以及topViewController属性,这里没有演示)但是我用相同的代码尝试了它。)

我想避免扩展导航视图控制器,老实说,虽然我可以很容易地在委托上放置一个属性 - 但是我想知道在现有框架内是否可以实现这种行为(似乎应该在它发生之前调用之后发生的事情,但似乎导航控制器的状态在之前被修改过。)

谢谢!

2 个答案:

答案 0 :(得分:5)

我不认为使用UINavigationControllerDelegate的答案是有效的,因为正如问题所指出的那样,在调用委托时,将要显示的视图控制器已经是navigationController.topViewController和navigationController.visibleViewController的值。

相反,请使用观察员。

步骤1.设置观察者以观察UINavigationControllerWillShowViewController通知:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(viewControllerChange:) name:@"UINavigationControllerWillShowViewControllerNotification" object:self.navigationController];

步骤2.创建通知回调(在此示例中称为viewControllerChange)并使用通知userInfo字典中的键来查看上一个和下一个视图控制器:

(void)viewControllerChange:(NSNotification *)notification {
    NSDictionary *userInfo = [notification userInfo];
    NSLog(@"Switching from %@ to %@", [[userInfo objectForKey:@"UINavigationControllerLastVisibleViewController"] class], [[userInfo objectForKey:@"UINavigationControllerNextVisibleViewController"] class]);
}

答案 1 :(得分:2)

- (void)navigationController:(UINavigationController*)nc
       didShowViewController:(UIViewController*)vc
                    animated:(BOOL)animated
{
  NSLog(@"Switching from %@ to %@",
   NSStringFromClass([vc class]),
   NSStringFromClass([[nc.viewControllers objectAtIndex:[nc.viewControllers count]-1] class]));
}