Ios 将选择器从UIViewController传递到UIView

Ios 将选择器从UIViewController传递到UIView,ios,swift,Ios,Swift,我创建了一个从UIView继承的自定义类BlueView。 我想在用户点击BlueView时调用UIViewController中的一个方法。但是,每当我点击BlueView时,我的程序就会崩溃,出现以下异常: 2019-09-15 23:06:14.960704-0400 DoubleViewApp[2418:70709] -[DoubleViewApp.BlueView handleBlueTapWithSender:]: unrecognized selector sent to inst

我创建了一个从UIView继承的自定义类BlueView。 我想在用户点击BlueView时调用UIViewController中的一个方法。但是,每当我点击BlueView时,我的程序就会崩溃,出现以下异常:

2019-09-15 23:06:14.960704-0400 DoubleViewApp[2418:70709] -[DoubleViewApp.BlueView handleBlueTapWithSender:]: unrecognized selector sent to instance 0x7f820cd06790
UIView:

import UIKit

class BlueView: UIView {

  override init(frame: CGRect) {
    super.init(frame: frame)
    createSubview()
  }

  required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    createSubview()
  }

  func createSubview() {
    print("createSubview from BlueView")
    backgroundColor = .blue

    let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap(sender:)))
    addGestureRecognizer(tap)
  }

  func setTapGesture(action: Selector?) {
    let tap = UITapGestureRecognizer(target: self, action: action)
    addGestureRecognizer(tap)
  }

  @objc func handleTap(sender: UITapGestureRecognizer? = nil) {
    print("NO! DO NOT TAP THE BLUE SQUARE.")

  }

}
视图控制器:

import UIKit

class ViewController: UIViewController {


  override func viewDidLoad() {
    super.viewDidLoad()
    print("Hello World")
    // Do any additional setup after loading the view.
    let bview = BlueView(frame: CGRect(x: 0, y: 0, width: 300, height: 300))
    let rview = RedView(frame: CGRect(x: 0, y: 300, width: 300, height: 300))
    view.addSubview(bview)
    view.addSubview(rview)

    bview.setTapGesture(action: #selector(handleBlueTap(sender:)))
  }


  @objc func handleBlueTap(sender: UITapGestureRecognizer? = nil) {
    print("This is a funny message.")
    //Todo: Present new ViewController
  }
}

您还必须为选择器设置正确的目标。目前,您正在将目标设置为BlueView实例,但希望它成为视图控制器

类BlueView:UIView{ ... func setTapGesturetarget:有吗?,操作:选择器{ AddGestureRecognitzerUITapGestureRecognitzerTarget:目标,操作:操作 } ... } &然后您可以使用:

bview.setTapGesturetarget:self,action:Selector或HandleBlueTapSender:
BlueView没有把手蓝色水龙头。对,我想这就是问题所在。我通过在UIViewContainer中创建UITapGestureRecognitizer并使用SetTapPassive将其传递给BlueView解决了这个问题。有没有更标准的方法?让BlueView知道它所包含的UIViewController是更好的方法吗?