0

我在我的应用程序的根视图控制器的第一级添加了一个平移手势,让用户在任何地方滑动以转到导航堆栈中的上一级(手势不在 0 级以防止进入黑色洞 :) )。这在 7 之前的 iOS 版本上有效并且仍然可以正常工作。

当我尝试使用 iOS 7 向后滑动时,我在控制台中收到以下消息: [11050:a0b] 嵌套弹出动画可能导致导航栏损坏 [11050:a0b] 在意外状态下完成导航转换。导航栏子视图树可能会损坏。

此时,应用程序还没有崩溃。

然后,当我尝试再次滑回上一级时,它崩溃了。我只是想弄清楚为什么这个错误在 iOS 7 中出现了,以及如何修复它。任何帮助都将得到应有的高度赞赏!

这是我的代码:

RootViewController.m:

- (void)viewDidLoad
{
    [super viewDidLoad];
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(pop:)];

    pan.delegate = self;

    [self.view addGestureRecognizer:pan];
}

- (void)pop:(UIPanGestureRecognizer*)pan
{
    if (pan.state == UIGestureRecognizerStateBegan || pan.state == UIGestureRecognizerStateChanged)
    {
        CGPoint vel = [pan velocityInView:self.view];

        if (vel.x > 1000)
        {
            [self.navigationController popViewControllerAnimated:YES];
        }
    }
}
4

3 回答 3

1

我怀疑问题出在你的状态。通过对 UIGestureRecognizerStateBegan 和 UIGestureRecognizerStateChanged 的​​测试,委托触发了许多弹出(它们是动画的,因此在前一个仍然动画时触发下一个弹出)。

相反,测试if (pan.state == UIGestureRecognizerStateEnded)以获得您需要的那个。

此外,当 NavVC 已经处于根目录时,不要担心突然出现在任何地方。它足够聪明,不会弹出根目录。

(至于为什么这仅在 os7 中行为不端,我只能推测 < ios7 逻辑在弹出过程的早期阶段删除了手势识别器)。

于 2013-09-19T20:36:52.177 回答
1

如果在 UINavigationController 的堆栈中有当前控制器可见的后退按钮,用户将能够从屏幕的左边缘向右滑动以返回。如果应用程序在 iOS7 上运行,您可能需要考虑不添加平移手势识别器。

您可以使用 . 检查 iOS 版本[UIDevice currentDevice].systemVersion

我意识到您的问题表明您添加了手势识别器以允许用户在任何地方滑动以返回,但是(希望)iOS7 用户会很快熟悉从屏幕左边缘滑动。

于 2013-09-19T20:45:41.410 回答
0

当速度达到 1000 时,它会在每次调用函数时弹出视图控制器,当它的动画为 YES 时,它会在弹出视图控制器之前被调用几次,我认为这会给你带来崩溃。

于 2013-09-19T20:35:45.443 回答