Search code examples
iosswiftnavigationuigesturerecognizergesture

Navigation Bar removeGestureRecognizer is not removing the Guesture


I need to add Tap Gesture on Navigation Bar or View. I got the below solution which works perfectly fine.

But removeGestureRecognizer is not removing the gesture and it's breaking the functionality of other back buttons in other view controllers.

How to fix the issue?

var taskTodoOnBar : UITapGestureRecognizer!

override func viewWillAppear(animated: Bool)
{
    navigationController?.view.addGestureRecognizer(taskTodoOnBar)
}

override func viewWillDisappear(animated: Bool)
{
    navigationController?.view.removeGestureRecognizer(taskTodoOnBar)
}

Or

override func viewWillAppear(animated: Bool)
{
    navigationController?.navigationBar.addGestureRecognizer(taskTodoOnBar)
}

override func viewWillDisappear(animated: Bool)
{
    navigationController?.navigationBar.removeGestureRecognizer(taskTodoOnBar)
}

When I try to get gestureRecognizers count, It says nil. Then where is the gesture being added ?

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

Solution

  • Try using this

    Declared gesture as

    let tapGesture : UITapGestureRecognizer = UITapGestureRecognizer()
    

    Gesture Handler

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

    Added in Navigation bar as

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

    Removed as

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

    Updated Answer for - gesture count prints nil

    console Output :

    enter image description here