代码之家  ›  专栏  ›  技术社区  ›  groundhog

如何确定uinavigationcontrollers中以前的visibleviewcontroller?

  •  4
  • groundhog  · 技术社区  · 17 年前

    我在导航视图继承关系的上下文中切换视图,我希望能够在切换时确定在新视图下推送的先前视图是什么。

    我正在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应用程序名称[85913:20B]切换自 管理屏幕到管理屏幕

    不幸的是,在调用“will”之前,它已经在uinavigationcontroller的状态下交换出去,这样传入的viewcontroller始终与uinavigationcontroller上的visibleviewcontroller相同(以及topviewcontroller属性,这里没有演示,但我用相同的代码尝试过)。

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

    谢谢!

    2 回复  |  直到 16 年前
        1
  •  2
  •   Jason Coco superfell    17 年前
    - (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]));
    }
    
        2
  •  5
  •   Dan Grigsby    16 年前

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

    相反,使用观察者。

    步骤1。设置观察者以监视uinavigationcontrollerwillshowviewcontroller通知:

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

    步骤2。创建通知回调(在本例中称为viewcontrollerchange),并使用通知用户信息字典中的键查看最后一个和下一个视图控制器:

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