在tapGesture动作select器中包含协议function – iOS Swift

我有一个类(FilterBar.swift)和一个viewcontroller。 viewcontroller调用该类来填充一个具有图像列表的scrollView对象,每个图像都有一个tapGestureRecognizer添加到它,如下所示:

let tapGesture = UITapGestureRecognizer( target: imgView, action: Selector("filterClicked:")); tapGesture.numberOfTapsRequired = 1; tapGesture.numberOfTouchesRequired = 1; imgView.addGestureRecognizer(tapGesture); 

我也有一个在FilterBar中的函数,如下所示:

  @objc func filterClicked(sender: UITapGestureRecognizer) { print(sender.view?.superview?.description) print("sent from view: \(sender.view!.tag)"); } 

当我尝试点击图片时出现以下错误:

 2016-03-16 02:06:45.800 ImageFilter[71811:6885004] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIImageView delegate.filterClicked:]: unrecognized selector sent to instance 0x7fc07951f010' 

所以我想也许我需要一个协议,所以我在FilterBar中创build了一个协议如下:

 protocol FilterClickedDelegate { func filterClicked(sender: UITapGestureRecognizer); } let delegate:FilterClickedDelegate? (adjusted this line) let tapGesture = UITapGestureRecognizer( target: imgView, action: Selector("delegate.filterClicked:")); 

我将该协议添加到viewcontroller类,我还添加了协议需要的function,但我仍然得到相同的错误。 所以第一个问题:我是否正确使用这个senario中的协议,因为这是在viewcontroller上运行?

第二个问题:我在select器中做错了什么? 有没有在select器中提到协议function的特定方法?

您的邮政编码的最后一行:

 (adjusted this line) let tapGesture = UITapGestureRecognizer( target: imgView, action: Selector("delegate.filterClicked:")); 

我认为应该是:

 (adjusted this line) let tapGesture = UITapGestureRecognizer( target: delegate, action: Selector("filterClicked:")); 

我认为这将起作用。
但我不build议这样做,这有些奇怪。 我通常做的是:

 (adjusted this line) let tapGesture = UITapGestureRecognizer( target: self, action: Selector("filterClicked:")); 

如果我真的需要通知delegate做些什么,我会打电话给delegatefilterClicked: 。 就像:

在ViewController中:

 fun filterClicked() { // delegate to do something delegate.xxx() } 

我想到了,在初始化UITapGestureRecognizer的目标部分中,您需要使用实际上是委托者委托的viewcontroller。 所以:

 let tapGesture = UITapGestureController(target: vc, action:"filterClicked:"); 

感谢所有,并希望这将帮助别人坚持在同一个问题!

干杯!