在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
做些什么,我会打电话给delegate
在filterClicked:
。 就像:
在ViewController中:
fun filterClicked() { // delegate to do something delegate.xxx() }
我想到了,在初始化UITapGestureRecognizer的目标部分中,您需要使用实际上是委托者委托的viewcontroller。 所以:
let tapGesture = UITapGestureController(target: vc, action:"filterClicked:");
感谢所有,并希望这将帮助别人坚持在同一个问题!
干杯!