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") } }
Use Selectors to Arrange Calls to Objective-C Methods In Objective-C, a selector is a type that refers to the name of an Objective-C method. In Swift, Objective-C selectors are represented by the Selector structure, and you create them using the #selector expression.
Discussion. Calling the perform(_:) method is equivalent to sending the aSelector message directly to the receiver, which you do in Swift using the dot syntax.
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(_:))
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With