相同的Viewcontroller多次弹出

时间:2014-07-23 14:02:17

标签: objective-c ios7 uigesturerecognizer

必需:

我想通过自定义导航后退按钮项启用iOS7滑动到后退功能。

当前实施:

经过大量的研究,我发现以下解决方案是最好的:

  1. 设置手势识别器的代理如下

    self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self;
    
  2. 这会产生很多错误,如stackoverflow answer所述。为避免这种情况,继承UINavigationController似乎是唯一可行的选择。我按照blog Keighl {{3}}中提到的那样做了。
  3. 问题:

    基本的滑动到背部功能正在运行,但奇怪的是,有时候,正在被解散的viewController相同,在弹出动作完成后会再次出现。

    即。假设导航堆栈看起来像 A - &gt;乙即可。弹出 B 将再次显示 B 。这种情况一直持续到最终viewController B 实际上被解雇并且 A 出现。

    所有viewController对象中的所有视图都会发生这种情况,而不仅仅是特定的视图。 此外,我已确保push方法仅在所有位置调用一次。

    我也尝试在每个点记录导航堆栈,但每个viewController只有一个实例。

    注意事项:

    我需要在某些视图中禁用滑动功能。我通过将代码分别编写到disableenable以及viewDidAppear中的滑动手势来完成此操作。

    请提供您宝贵的建议或解决此问题的方法。谢谢!

1 个答案:

答案 0 :(得分:0)

简短回答:如果要添加不存在的弹出手势,则应向视图控制器添加UIScreenEdgePanGestureRecognizer。修改现有的interactivePopGestureRecognizer可能不是正确的方法。这样做:

[self addGestureRecognizer:({
    UIScreenEdgePanGestureRecognizer *gesture =
        [[UIScreenEdgePanGestureRecognizer alloc]
        initWithTarget:self action:@selector(pop)];
    gesture;
})];

-(void)pop {
    // pop your view controller here
}

答案很长:强制interactivePopGestureRecognizer.delegate 会破坏您的代码。

如果您需要投射 self

self.navigationController.interactivePopGestureRecognizer.delegate =
    (id<UIGestureRecognizerDelegate>)self;

...这是因为self不是UIGestureRecognizerDelegate。以下应该编译,链接,构建和运行,或者你正在为自己设置麻烦:

self.navigationController.interactivePopGestureRecognizer.delegate = self;

请注意,假设您正在实施以下之一,确保调整适用于strong>你拥有的一个手势:

  1. UIGestureRecognizerDelegate
  2. gestureRecognizerShouldBegin:
  3. gestureRecognizer:shouldReceiveTouch:
  4. gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:
  5. gestureRecognizer:shouldRequireFailureOfGestureRecognizer:
  6. 通过不断更改您未创建的gestureRecognizer:shouldBeRequiredToFailByGestureRecognizer:委托,您所做的只是阻止iOS行为

    来自documentation

    UINavigationController -interactivePopGestureRecognizer

    手势识别器负责将顶视图控制器弹出导航堆栈。 (只读)

    用简单的英语:使用此值是您需要将该手势与您自己的手势相结合。但是你不应该修改它的行为:

    ...您可以使用此属性检索手势识别器,并将其与用户界面中其他手势识别器的行为联系起来......