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
Related videos on Youtube
Author by
Chris
Updated on August 26, 2020Comments
-
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 almost 8 yearsYou wrote
Selector("tap:")
. You got a warning. You ignored it. You crashed.
-
-
Chris Allinson over 7 yearsThis 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 about 7 yearsYou have to write it this way :
#selector(ClassName.MethodName)
Otherwise you can have an error about objc selector. -
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 over 6 yearsis...? It looks like there is a part of the sentence missing.