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

Posted

技术标签:

【中文标题】在 tapGesture 动作选择器中包含协议功能 - iOS Swift【英文标题】:Including protocol function in tapGesture action selector - iOS Swift 【发布时间】:2016-03-16 01:25:54 【问题描述】:

我有一个类 (FilterBar.swift) 和一个视图控制器。 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 中创建了一个协议,如下所示:

protocol FilterClickedDelegate 
    func filterClicked(sender: UITapGestureRecognizer);


let delegate:FilterClickedDelegate?

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

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

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

【问题讨论】:

哪一行崩溃了? 当我点击它崩溃的图像时不在任何一行 尝试删除@objc 同样的事情没有变化 target: imgView 将其更改为 - target: self, action... 【参考方案1】:

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

(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 去做。就像:

在视图控制器中:

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

【讨论】:

我不能使用目标:委托,因为它说它不是 AnyObject?我用你的方法试过了,根本没有开火。我必须使用委托,因为我是从另一个班级解雇它的。因此,如果我使用 self 以您的方式进行操作,那么 self 指的是类而不是我实际单击图像的视图控制器。【参考方案2】:

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

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

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

干杯!

【讨论】:

以上是关于在 tapGesture 动作选择器中包含协议功能 - iOS Swift的主要内容,如果未能解决你的问题,请参考以下文章

如何在 android studio 中包含应用内图标选择器?

当元素在标记名称中包含点时,Jquery 选择器不起作用

在 MVC Web 应用程序中包含 Jquery 时间选择器的步骤

如何在 sklearn.svm.libsvm.fit() 分类器中包含列表类型功能?

使用 tapGesture 自定义 UIView

用于 UILabel 问题的 UITapGesture 选择器