在 tapGesture 操作选择器中包含协议功能 - iOS Swift

Including protocol function in tapGesture action selector - iOS Swift

我有一个 class (FilterBar.swift) 和一个 viewcontroller。 viewcontroller 调用 class 以使用图像列表填充 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 中创建了一个协议,如下所示:

protocol FilterClickedDelegate {
    func filterClicked(sender: UITapGestureRecognizer);
}

let delegate:FilterClickedDelegate?

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

我将该协议添加到 viewcontroller class,并且我还添加了该协议所需的功能,但我仍然遇到相同的错误。所以第一个问题:我在这个场景中使用协议是否正确,因为这是 viewcontroller 上的 运行?

第二个问题:我在选择器中做错了什么?有没有特定的方式在选择器中提及协议功能?

您的 post 代码的最后一行:

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

我认为应该是:

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

我认为它会起作用。
但我不建议这样做,这有点奇怪。我通常做的是:

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

如果我真的需要通知delegate做某事,我会在filterClicked:中调用delegate去做。就像:

在ViewController:

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

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

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

谢谢大家,希望这能帮助其他陷入同样问题的人!

干杯!