Edward Hung Edward Hung - 6 months ago 45
Swift Question

Pass extra argument for UItapgestureRecognizer with selector

I have two labels, Label1 and Label2. I want to make a single function that prints out which label is tapped by creating UITTapRecognizer for both labels calling the same function with selector that passes an argument. Below is the long way of doing it which is messy but works. If I know how to pass an argument (Int) into the selector, it would be alot cleaner.

let topCommentLbl1Tap = UITapGestureRecognizer(target: self, action: #selector(DiscoverCell().doubleTapTopComment1))
topCommentLbl1Tap.numberOfTapsRequired = 2
topCommentLbl1.userInteractionEnabled = true

let topCommentLbl2Tap = UITapGestureRecognizer(target: self, action: #selector(DiscoverCell().doubleTapTopComment2))
topCommentLbl2Tap.numberOfTapsRequired = 2
topCommentLbl2.userInteractionEnabled = true

func doubleTapTopComment1() {
print("Double Tapped Top Comment 1")
func doubleTapTopComment2() {
print("Double Tapped Top Comment 2")

Is there a way to modify the selector method such that I can do something like

func doubleTapTopComment(label:Int) {
if label == 1 {
print("label \(label) double tapped")

Avi Avi

Short answer: no

The selector is called by the UITapGestureRecognizer, and you have no influence on what parameters it passes.

However, what you can do is query the recognizer's view property to get the same information.

func doubleTapComment(recognizer: UIGestureRecognizer) {
    if recognizer.view == label1 {
    else if recognizer.view == label2 {