Ios io7完成转换时的导航检查

Ios io7完成转换时的导航检查,ios,ios7,uinavigationcontroller,swipe,Ios,Ios7,Uinavigationcontroller,Swipe,我想标记我的UINavigationController是否正在设置推/弹出动画 我有一个BOOL变量_isAnimating,下面的代码似乎可以工作: - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { _isAnimat

我想标记我的UINavigationController是否正在设置推/弹出动画

我有一个BOOL变量_isAnimating,下面的代码似乎可以工作:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    _isAnimating = YES;
}

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    _isAnimating = NO;
}
但它在iOS7中使用滑动手势时工作不正确。假设我的导航是:根->视图A->视图B。我现在在B

在从B滑回A的开始,将调用函数navigationController:willShowViewController:animated:BOOLanimated,然后_isAnimating=YES

正常情况下,刷卡完成后返回A,调用函数navigationController:didShowViewController:animated:BOOLanimated,然后_isAnimating=NO。这种情况可以,但是:

如果用户可能只需滑动半个过渡到a,然后不想滑动到上一个视图a,他将再次转到当前视图并再次停留在B。然后未调用函数navigationController:didShowViewController:animated:BOOLanimated,我的变量的值不正确_isAnimating=YES


在这种异常情况下,我没有机会更新变量。有没有办法更新导航状态?谢谢大家!

可以在UINavigationController的InteractiveePopgestureRecognizer属性中找到解决问题的线索。这是一个识别器,它通过滑动手势响应弹出控制器。您可以注意到,当用户举手时,识别器的状态更改为UIgestureRecognitizerStateEnded。因此,除导航控制器委托外,您还应将目标添加到Pop识别器:

UIGestureRecognizer *popRecognizer = self.navigationController.interactivePopGestureRecognizer;
[popRecognizer addTarget:self                       
                  action:@selector(navigationControllerPopGestureRecognizerAction:)];
每次Pop识别器更改时(包括手势结束时),都会调用此操作

- (void)navigationControllerPopGestureRecognizerAction:(UIGestureRecognizer *)sender
{
    switch (sender.state)
    {
        case UIGestureRecognizerStateEnded:

        // Next cases are added for relaibility
        case UIGestureRecognizerStateCancelled:
        case UIGestureRecognizerStateFailed:

            _isAnimating = NO;
            break;

        default:
            break;
    }
}

请注意,不要忘记InteractiveEPopgestureRecognizer属性自iOS 7起就可用

您是否尝试过使用UIViewController的isBeingPresented属性?Cháo!您是否尝试过ViewWillDisplay:?@henryeverett和Thanh NhonNGUYEN正在演示,ViewWillDisplay:在A或B中。我的代码不是A或B,它是另一个类它是UINavigationController的代理,它的角色是导航管理器。另外,我的代码可能有很多视图,有A,B,C,D。。。。。不仅仅是A和B为什么不跟踪视图中的变量将出现:BOOLanimated和viewwilldefine:BOOLanimated各自VCs的方法?添加代理协议并使VCs符合该协议。这应该使你的经理能够收到风投的回电,如果这是你想要的。@camdaochemgio你有什么解决办法吗。我遇到了同样的问题我对UINavigationControllers不是很好,如何检测动画结束后第一个或第二个视图控制器是否会显示?我尝试过使用navigationController属性,但在方法中它为null。状态也没有用,它总是在我的测试中结束。你知道我怎么能检测到吗?你说的第一个和第二个“控制器”是什么意思?如果需要了解用户是否完成了手势,可以在didShowViewController方法中添加一个标志_swipeCompleted并将其设置为YES。您还可以查看导航控制器的ViewController属性,它始终包含堆栈中的所有控制器。如果您需要知道动画结束前将显示哪个控制器,请使用传递给willShowViewController的变量viewController。