在标签栏控制器中禁用和启用导航控制器向后滑动的正确方法

Posted

技术标签:

【中文标题】在标签栏控制器中禁用和启用导航控制器向后滑动的正确方法【英文标题】:Correct way to disable and enable swipe back for navigation controllers in tab bar controllers 【发布时间】:2016-10-08 14:39:29 【问题描述】:

我有一个带有三个标签的TabBarController。第一个和最后一个选项卡是导航控制器,我希望在其中启用向后滑动。中间选项卡只是一个标准的viewController。默认情况下,似乎未启用向后滑动。我想这是因为我在这两个navigationControllers 中使用了后退按钮。我已经在两个导航控制器的根视图控制器中尝试了以下代码来启用它:

viewDidLoad

self.navigationController?.interactivePopGestureRecognizer?.delegate = self

并符合UIGestureRecognizerDelegate:

func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool 

        if (self.navigationController?.viewControllers.count)! > 1 
            return true
        

        return false
    

现在重新滑动可以正常工作,但是偶尔如果其中一个视图控制器将另一个视图控制器推到 UI 顶部并且应用程序将全部冻结。在 Swift 中启用和禁用回扫的正确方法是什么?

【问题讨论】:

【参考方案1】:

对于像我这样在 2 年后发现这个问题却没有答案的人

视图控制器

viewDid<strong>Appear</strong>

self.navigationController?.interactivePopGestureRecognizer?.delegate = self

还有你的UIGestureRecognizerDelegate

extension YourViewController: UIGestureRecognizerDelegate 
func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool 
    if gestureRecognizer.isEqual(navigationController?.interactivePopGestureRecognizer) 
        navigationController?.popViewController(animated: true)
    
    return false

【讨论】:

在 Swift 5.2 中工作。谢谢,非常聪明。【参考方案2】:

实现这一目标的两个步骤:

    UIGestureRecognizerDelegate 添加到您的类继承中 在viewDidLoad 中添加以下内容:

启用向后滑动:

navigationController?.interactivePopGestureRecognizer?.isEnabled = true

禁用向后滑动:

navigationController?.interactivePopGestureRecognizer?.isEnabled = false

【讨论】:

只需实现 UIGestureRecognizerDelegate 然后在gestureRecognizerShouldBegin中执行操作

以上是关于在标签栏控制器中禁用和启用导航控制器向后滑动的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 3.0 中实现滑动以在没有导航栏的情况下向后导航

Ionic 2禁用没有导航栏的向后滑动

当用户直接点击标签栏项目时,如何禁用滑动动画?

向后滑动时嵌套推送动画可能导致导航栏损坏

隐藏导航栏时如何启用滑动手势?

UITableView:向上滑动时收缩标签栏和导航栏