Pass extra argument for UItapgestureRecognizer with selector

后端 未结 4 1451
日久生厌
日久生厌 2020-12-11 22:33

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 fu

相关标签:
4条回答
  • 2020-12-11 22:51

    I believe a UITapGestureRecognizer can only be used for a single view. That said, you can have 2 different UITapGestureRecognizers call the same selector and then access the UITapGestureRecognizer in the function. See the following code:

    import UIKit
    
    class ViewController: UIViewController {
    
        override func viewDidLoad() {
    
            super.viewDidLoad()
    
            let label1 = UILabel()
            label1.backgroundColor = UIColor.blueColor()
            label1.frame = CGRectMake(20, 20, 100, 100)
            label1.tag = 1
            label1.userInteractionEnabled = true
            self.view.addSubview(label1)
    
            let label2 = UILabel()
            label2.backgroundColor = UIColor.orangeColor()
            label2.frame = CGRectMake(200, 20, 100, 100)
            label2.tag = 2
            label2.userInteractionEnabled = true
            self.view.addSubview(label2)
    
            let labelOneTap = UITapGestureRecognizer(target: self, action: #selector(ViewController.whichLabelWasTapped(_:)))
            let labelTwoTap = UITapGestureRecognizer(target: self, action: #selector(ViewController.whichLabelWasTapped(_:)))
    
            label1.addGestureRecognizer(labelOneTap)
            label2.addGestureRecognizer(labelTwoTap)
    
    }
    

    Both UITapGestureRecognizers call the same function:

    func whichLabelWasTapped(sender : UITapGestureRecognizer) {
        //print the tag of the clicked view
        print (sender.view!.tag)
    }
    

    If you try to add one of the UITapGestureRecognizers to both labels, then only the last one added will actually call the function.

    0 讨论(0)
  • 2020-12-11 22:51

    You can do like this,

    let topCommentLbl1Tap = UITapGestureRecognizer(target: self, action: #selector(labelTapped(_:)))
    let topCommentLbl2Tap = UITapGestureRecognizer(target: self, action: #selector(labelTapped(_:)))
    label1.addGestureRecognizer(topCommentLbl1Tap)
    label2.addGestureRecognizer(topCommentLbl2Tap)
    
    @objc
     func textViewTapped(_ sender: UITapGestureRecognizer) {
        if(sender.view.tag == label1.tag) {
           print("I am label1")
        } else if(sender.view.tag == label2.tag) {
           print("I am label2")
        }
      }
    

    don't forgot to set tags to labels.

    0 讨论(0)
  • 2020-12-11 23:05

    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 {
            ...
        }
    }
    
    0 讨论(0)
  • 2020-12-11 23:13

    Provide both gesture recognizers with the same selector that takes a single parameter. That action method will be passed instance of a UIGestureRecognizer, and happily, that gesture recognizer has a property called view, which is the view to which the gr is attached.

    ... action: #selector(doubleTapTopComment(_:))
    
    func doubleTapTopComment(gestureRecognizer: gr) {
        // gr.view is the label, so you can say gr.view.text, for example
    }
    
    0 讨论(0)
提交回复
热议问题