【问题标题】:Same Viewcontroller pops multiple times同一个 Viewcontroller 多次弹出
【发布时间】:2014-07-23 14:02:17
【问题描述】:

必填:

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

当前实施:

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

  1. 如下设置手势识别器的委托

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

问题:

基本的向后滑动功能可以正常工作,但奇怪的是,有时,被关闭的同一 viewController 在弹出操作完成后再次出现。

即假设导航堆栈看起来像 A -> B。弹出 B 将再次弹出 B。这种情况一直在发生,直到最终 viewController B 真正被解除并且 A 出现。

这发生在所有 viewController 对象中的所有视图上,而不仅仅是特定的视图。 另外,我确保push 方法在所有地方只被调用一次。

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

注意事项:

我需要在某些视图中禁用滑动功能。我通过将代码分别写入disableenable 中的滑动手势viewDidAppearviewDidDisappear 来做到这一点。

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

【问题讨论】:

  • 这个答案真的对你有用吗?
  • 在那之后没有尝试过。但现在,我认为使用 View Controller Transitioning API 也可以实现同样的效果。

标签: objective-c ios7 uigesturerecognizer


【解决方案1】:

简答:如果您想在不存在的地方添加弹出手势,则应在视图控制器中添加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;

请注意,作为UIGestureRecognizerDelegate 专门允许您在运行时调整手势的行为,假设您正在实现以下之一确保调整适用于您拥有的手势

  1. gestureRecognizerShouldBegin:
  2. gestureRecognizer:shouldReceiveTouch:
  3. gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:
  4. gestureRecognizer:shouldRequireFailureOfGestureRecognizer:
  5. gestureRecognizer:shouldBeRequiredToFailByGestureRecognizer:

通过不断更改不是您创建的interactivePopGestureRecognizer委托,您所做的只是阻止 iOS 行为发生。

来自documentation

UINavigationController -interactivePopGestureRecognizer

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

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

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

【讨论】:

  • 嗨。感谢您的详细回答。您的意思是如果我将演员表移除到自我,它会起作用吗?
  • 不完全。我相信你根本不应该设置self.navigationController.interactivePopGestureRecognizer.delegate。这走错了方向。当您完全删除该行时,什么不起作用
  • 好的。看,我的应用程序中有自定义左栏按钮项目。当我使用它们时,默认的滑动手势功能就消失了。根据SO answer,将委托设置为 self 将启用它。
  • 您还有什么其他建议可以使用自定义 leftBarButton 项目启用滑动功能吗?
  • es。您应该添加一个 UIScreenEdgePanGestureRecognizer。我更新了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多