同一个 Viewcontroller 多次弹出

Posted

技术标签:

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

必填:

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

当前实施:

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

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

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

问题:

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

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

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

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

注意事项:

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

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

【问题讨论】:

这个答案真的对你有用吗? 在那之后没有尝试过。但现在,我认为使用 View Controller Transitioning API 也可以实现同样的效果。 【参考方案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 专门允许您在运行时调整手势的行为,假设您正在实现以下之一确保调整适用于您拥有的手势

    gestureRecognizerShouldBegin: gestureRecognizer:shouldReceiveTouch: gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: gestureRecognizer:shouldRequireFailureOfGestureRecognizer: gestureRecognizer:shouldBeRequiredToFailByGestureRecognizer:

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

来自documentation

UINavigationController -interactivePopGestureRecognizer

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

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

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

【讨论】:

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

以上是关于同一个 Viewcontroller 多次弹出的主要内容,如果未能解决你的问题,请参考以下文章

将 ViewController 呈现为弹出框

如何在 ViewController 中多次使用自定义 nib 视图

如何将 ViewController 呈现为具有透明背景的弹出式 VC?

UINavigationController:弹出时释放 ViewController 的内存

需要协助解除模态呈现的 ViewController 并从 UINavigationController 弹出 ViewController

tableView:canEditRowAtIndexPath: 弹出 viewController 时崩溃