BadmintonCat
BadmintonCat

Reputation: 9576

UITapGestureRecognizer unrecognized selector sent to instance

I've searched for solutions to this problem but couldn't find anything that seems to address it in my case. I'm getting the above exception from a UITapGestureRecognizer.

Here's the simplified code:

import UIKit;

class ViewController : UIViewController, UIScrollViewDelegate
{
    @IBOutlet weak var scrollView:UIScrollView!;
    var imageView:UIImageView!;

    override func viewDidLoad()
    {
        super.viewDidLoad();

        ... set up imageView/scrollView here ...

        let doubleTapRecognizer = UITapGestureRecognizer(target: self, action: "onScrollViewDoubleTapped");
        doubleTapRecognizer.numberOfTapsRequired = 2;
        doubleTapRecognizer.numberOfTouchesRequired = 1;
        scrollView.addGestureRecognizer(doubleTapRecognizer);
    }


    func onScrollViewDoubleTapped(recognizer:UITapGestureRecognizer)
    {
    }
}

Can anyone tell what is wrong with this code? It seems all correct to me. I suspect that it has to do with assigning ViewController as delegate to scrollView (or vice versa)? However the ViewController is set as the delegate to scrollView. But maybe it's something else that causes this error?

Upvotes: 12

Views: 15056

Answers (6)

Daniel Storm
Daniel Storm

Reputation: 18878

Swift 4 using #selector.

let tapGesture: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(didSelectItem(sender:)))

@objc func didSelectItem(sender: AnyObject?) {
    print("didSelectItem: \(sender)")
}

Upvotes: 5

Jacobo Koenig
Jacobo Koenig

Reputation: 12514

In my case, with Swift 4, the selector was correctly defined, but since the item with the gesture was inside a collection view, it was causing the selector not to be found. I implemented a custom cell and configured the selector inside of it

let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "recent", for: indexPath) as! MyCollectionViewCell

cell.configureGestureWith(entry: recentEntries.sorted(by: {$0.createdAt > $1.createdAt})[indexPath.row], sender: self)

Hope this helps some one.

Upvotes: 0

roshan posakya
roshan posakya

Reputation: 1030

for swift 4

override func viewDidLoad() {
        super.viewDidLoad()

    let tap = UITapGestureRecognizer(target: self, action: #selector(SignUpViewController.click))
    userImage.addGestureRecognizer(tap)
    userImage.isUserInteractionEnabled = true
}

@objc func click()
{
    print("Tapped on Image")
}

where SignUpViewController is your viewcontroller name

Upvotes: 1

Luca Davanzo
Luca Davanzo

Reputation: 21510

Maybe could help someone: I had this error because I declared private the selector method:

func setup() {
  let singleFingerTap = UITapGestureRecognizer(target: self, action: "didTapOnViewInteraction:")
  singleFingerTap.numberOfTapsRequired = 1
  self.viewInteraction.addGestureRecognizer(singleFingerTap)
}

private func didTapOnViewInteraction(recognizer: UITapGestureRecognizer) {

}

Removing "private" keyword, all works great!

Upvotes: 1

ODAXY
ODAXY

Reputation: 335

Also try adding a parameter to your method:

...(target: self, action: "yourMethodName:")

func yourMethodName(sender: AnyObject?)
{
    println("Clicked yourMethodName")
}

Upvotes: 2

Connor
Connor

Reputation: 64634

Try adding a colon to your selector string.

let doubleTapRecognizer = UITapGestureRecognizer(target: self, action: "onScrollViewDoubleTapped:");

As cabellicar123 mentioned, this indicates that the selector takes an argument.

Upvotes: 24

Related Questions