Selector in swift3

47,900

Solution 1

Selector("tap:") should now be written as #selector(tap(gestureReconizer:))

Also, you should declare tap as func tap(_ gestureRecognizer: UITapGestureRecognizer) as per the new Swift API Guidelines in which case your selector would then become #selector(tap(_:)).

Solution 2

In Swift 3 it works like this:

@IBOutlet var myView: UIView!
override func viewDidLoad() {
    super.viewDidLoad()

    let tap = UITapGestureRecognizer(target: self, action:#selector(handleTap))

    myView.addGestureRecognizer(tap)
}

func handleTap() {
    print("tapped")
}

Solution 3

Swift 3 came with new syntax so instead of using Selector("tap:"), #selector(tap(gestureReconizer:)) is

Share:
47,900

Related videos on Youtube

Chris
Author by

Chris

Updated on August 26, 2020

Comments

  • Chris
    Chris over 3 years

    Why doesn't this work in swift 3 ? It crashes at runtime saying:

    '-[my_app_name.displayOtherAppsCtrl tap:]: unrecognized selector sent to instance 0x17eceb70'

        override func viewDidLoad() {
        super.viewDidLoad()
    
        // Uncomment the following line to preserve selection between presentations
        // self.clearsSelectionOnViewWillAppear = false
    
        // Register cell classes
        //self.collectionView!.register(ImageCell.self, forCellWithReuseIdentifier: reuseIdentifier)
    
        // Do any additional setup after loading the view.
    
      let lpgr = UITapGestureRecognizer(target: self, action: Selector("tap:"))
        lpgr.delegate = self
        collectionView?.addGestureRecognizer(lpgr)
    }
    
    func tap(gestureReconizer: UITapGestureRecognizer) {
    if gestureReconizer.state != UIGestureRecognizerState.ended {
      return
    }
    
    let p = gestureReconizer.location(in: self.collectionView)
    let indexPath = self.collectionView?.indexPathForItem(at: p)
    
    if let index = indexPath {
      //var cell = self.collectionView?.cellForItem(at: index)
      // do stuff with your cell, for example print the indexPath
      print(index.row)
    } else {
      print("Could not find index path")
    }
    }
    
    • matt
      matt almost 8 years
      You wrote Selector("tap:"). You got a warning. You ignored it. You crashed.
  • Chris Allinson
    Chris Allinson over 7 years
    This is great as it shows you have to init the UITapGestureRecognizer inside a method ... I was having major issues because I was (albeit dumbly) declaring and init'ing the tap at the top of the file. Poor debugging messages ensued, and it took quite a while to solve :S ... to be noted, if you make the function private, you seemingly must add @objc before the "private func ..."
  • RoaflinSabos
    RoaflinSabos about 7 years
    You have to write it this way : #selector(ClassName.MethodName) Otherwise you can have an error about objc selector.
  • jjatie
    jjatie almost 7 years
    @RoaflinSabos You only need to include a class name if the method is outside of the class the selector is declared in. It also does not affect Objective-C visibility.
  • msanford
    msanford over 6 years
    is...? It looks like there is a part of the sentence missing.