通过弹出navigationController或使用选项卡栏来识别是否到达viewController的更好方法

时间:2014-02-05 13:20:41

标签: ios uiviewcontroller uinavigationcontroller uitabbarcontroller pushviewcontroller

尝试澄清:我希望能够区分以下两种情况:

  • viewController的视图因pop而变为活动状态。
  • viewController的视图因tabBar-navigation
  • 而变为活动状态

在我正在处理的应用程序中,我需要知道是否由于其导航控制器被弹出而呈现了一个viewController。我查看了这个post并认为我通过简单地调用:

找到了解决方案
BOOL wasReachedByPopping = !self.isMovingToParentViewController;

在我的viewWillAppear:方法

这适用于大多数情况,但不幸的是,当通过tabBarController切换navigationControllers时会出现误报。我一直在考虑在我的viewController中添加一个名为pushNewController的BOOL,在推送之前将其设置为YES。

self.pushedNewController = YES; // whenever I plan to push

这应该可以正常工作,但我真的很不高兴不得不把它作为像持久的BOOL状态一样凌乱的东西。任何人都有一个更好的方法来识别是否popCon到达了viewController?


编辑:我感谢下面的努力,但似乎他们只提供了我已经拥有的完全相同的功能。没有任何方法可以区分弹出或移动到标签栏导航。似乎我将不得不解决内部BOOL来存储viewController是否请求推送。我为以下任何感兴趣的人设置了以下方式:

- (void)viewDidDisappear:(BOOL)animated{
    self.disappearedDueToPush = (self != [self.navigationController.viewControllers lastObject]);
}

5 个答案:

答案 0 :(得分:1)

您是否查看过UINavigationControllerDelegate种方法:

– navigationController:willShowViewController:animated:
– navigationController:didShowViewController:animated:

当视图控制器被按下或弹出导航堆栈时,会调用它们。

有关详细信息,请参阅Apple docs

答案 1 :(得分:1)

您需要UINavigationControllerDelegate,特别是didShowViewController:方法。这是一个用法示例:

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    if (viewController == self) {
        NSLog(@"%@",viewController);
    }
}

答案 2 :(得分:0)

如果是否弹出了viewcontroller,你可以使用这个条件!!!

if ([self.navigationController.viewControllers indexOfObject:viewControllerObj] == NSNotFound)
{
    [self.navigationController pushViewController:viewControllerObj animated:YES];
}
else
{
    [self.navigationController popToViewController:viewControllerObj animated:YES];
}

答案 3 :(得分:0)

试试这个......

if ([self.navigationController.viewControllers containsObject:<Your View Controller>])
{
    NSLog(@"It is Pushed");
}
else
{
    NSLog(@"It is Poped");
}

答案 4 :(得分:0)

所以回顾一下,似乎没有办法存储推送作为状态执行的事实。从下面提供的答案中,可以通过实施UINavigationControllerDelegate并使用navigationController:willShowViewController:animated:方法来设置此状态:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated{
    self.disappearedDueToPush = !(viewController == self);
}

如果实现委托似乎有点沉重(它对我有用),你可能会在viewDidDisappear方法中提出以下内容:

if (self != [self.navigationController.viewControllers lastObject]){
    self.disappearedDueToPush = YES;
}

这对我来说更有意义,因为反向逻辑(以及对事实的检查)是在viewWillAppear方法中执行的。