Passing arguments to selector in Swift

后端 未结 6 703
闹比i
闹比i 2020-11-27 03:14

I\'m programmatically adding a UITapGestureRecognizer to one of my views:

let gesture = UITapGestureRecognizer(target: self, action: #selector(self.handleTap         


        
6条回答
  •  鱼传尺愫
    2020-11-27 03:34

    Swift 5.0 iOS 13

    I concur a great answer by Ninad. Here is my 2 cents, the same and yet different technique; a minimal version.

    Create a custom class, throw a enum to keep/make the code as maintainable as possible.

    enum Vs: String {
      case pulse = "pulse"
      case precision = "precision"
    } 
    
    class customTap: UITapGestureRecognizer {
      var cutomTag: String?
    }
    

    Use it, making sure you set the custom variable into the bargin. Using a simple label here, note the last line, important labels are not normally interactive.

    let precisionTap = customTap(target: self, action: #selector(VC.actionB(sender:)))
    precisionTap.customTag = Vs.precision.rawValue
    precisionLabel.addGestureRecognizer(precisionTap)
    precisionLabel.isUserInteractionEnabled = true
    

    And setup the action using it, note I wanted to use the pure enum, but it isn't supported by Objective C, so we go with a basic type, String in this case.

    @objc func actionB(sender: Any) {
    // important to cast your sender to your cuatom class so you can extract your special setting.
      let tag = customTag as? customTap
      switch tag?.sender {
        case Vs.pulse.rawValue:
          // code
        case Vs.precision.rawValue:
          // code
        default:
          break
        }
    }
    

    And there you have it.

提交回复
热议问题