导航栏 removeGestureRecognizer 未删除 Guesture

Posted

技术标签:

【中文标题】导航栏 removeGestureRecognizer 未删除 Guesture【英文标题】:Navigation Bar removeGestureRecognizer is not removing the Guesture 【发布时间】:2018-01-23 04:47:13 【问题描述】:

我需要在导航栏或视图上添加点按手势。 我得到了以下解决方案,效果很好。

但是removeGestureRecognizer 并没有移除手势,而是破坏了其他视图控制器中其他后退按钮的功能。

如何解决这个问题?

var taskTodoOnBar : UITapGestureRecognizer!

override func viewWillAppear(animated: Bool)

    navigationController?.view.addGestureRecognizer(taskTodoOnBar)


override func viewWillDisappear(animated: Bool)

    navigationController?.view.removeGestureRecognizer(taskTodoOnBar)

或者

override func viewWillAppear(animated: Bool)

    navigationController?.navigationBar.addGestureRecognizer(taskTodoOnBar)


override func viewWillDisappear(animated: Bool)

    navigationController?.navigationBar.removeGestureRecognizer(taskTodoOnBar)

当我尝试获取手势识别器计数时,它显示为零。那么在哪里添加手势呢?

override func viewWillDisappear(animated: Bool)
  
   print(navigationController!.view.gestureRecognizers!.count)
   print(navigationController!.navigationBar.gestureRecognizers!.count)

【问题讨论】:

嗨 Sujay,您是否尝试过从视图中列出手势数组,例如 navigationController?.navigationBar.gestureRecognizers 以检查数组是否正常? navigationBar.gestureRecognizers 计数为零。已添加相同的问题。 【参考方案1】:

试试这个

将手势声明为

let tapGesture : UITapGestureRecognizer = UITapGestureRecognizer()

手势处理程序

@objc func tapHandler(handler: UITapGestureRecognizer)
        print("gesture Added")
    

在导航栏中添加为

override func viewDidLoad()
    
        super.viewDidLoad()
        tapGesture.numberOfTapsRequired = 1
        tapGesture.addTarget(self, action: #selector(VC2.tapHandler(handler:)))
        self.navigationController?.view.addGestureRecognizer(tapGesture)
    

删除为

override func viewWillDisappear(_ animated: Bool) 
        for gesture in (navigationController?.view.gestureRecognizers)! 
            if gesture == tapGesture 
                navigationController?.view.removeGestureRecognizer(tapGesture)
                print("removed")
            
        
    

更新的答案 - 手势计数打印为零

控制台输出:

【讨论】:

navigationController?.view.gestureRecognizers 返回 nil。所以在问题中添加了相同的内容。 检查更新的代码 - drive.google.com/open?id=1hFDjIPox7lC83dCBPadugWdmEJZWcxu1 我之前在此处发布了新链接,下载时无法使用 在 ViewDidLoad 中是的,即使我得到了相同的结果。您可以尝试在 viewWillDisappear 中打印相同的内容吗?在 VC3 中添加所有代码。所以当你回到 VC2 时,VC2 上的后退按钮应该可以工作并带你到 VC1 请让我检查一下【参考方案2】:

ios Geek 的帮助下,我发现,gestureRecognizers!.count 在 ViewdDidLoad 中为 2,但在 viewWillDisappear 中为 nil。

然后我挖掘了更多,发现我已经为我的后退按钮编写了自定义代码。

所以在这种情况下,我们应该在popToViewController之前移除GestureRecognizer

所以这适用于所有我不希望在使用自定义后退按钮时像我一样犯错误的人。

func backBarBtnFnc(sender: UIBarButtonItem)

    navigationController?.navigationBar.removeGestureRecognizer(taskTodoOnBar)

    // CodTdo ...

    self.navigationController!.popToViewController(VC2, animated: true)

【讨论】:

以上是关于导航栏 removeGestureRecognizer 未删除 Guesture的主要内容,如果未能解决你的问题,请参考以下文章

状态栏、导航栏、PopupWindow的使用

Electron菜单栏&导航栏隐藏

怎样删除淘宝导航栏?

小程序自定义导航栏仿原生固定在顶部

Android 沉浸式/透明式状态栏、导航栏

移动开发中导航栏和搜索栏在设计中应该注意哪些问题?