首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在tapGesture动作选择器- iOS Swift中包含协议功能

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

Stack Overflow用户
提问于 2016-03-16 01:25:54
回答 2查看 472关注 0票数 0

我有一个类(FilterBar.swift)和一个视图控制器。视图控制器调用类来使用图像列表填充scrollView对象,并且每个图像都添加了一个tapGestureRecognizer,如下所示:

代码语言:javascript
复制
        let tapGesture = UITapGestureRecognizer(
                        target: imgView, action: Selector("filterClicked:"));
        tapGesture.numberOfTapsRequired = 1;
        tapGesture.numberOfTouchesRequired = 1;
        imgView.addGestureRecognizer(tapGesture);

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

代码语言:javascript
复制
    @objc func filterClicked(sender: UITapGestureRecognizer) {
    print(sender.view?.superview?.description)
    print("sent from view: \(sender.view!.tag)");
}

当我试图单击该图像时,会得到以下错误:

代码语言:javascript
复制
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中创建了一个协议,如下所示:

代码语言:javascript
复制
protocol FilterClickedDelegate {
    func filterClicked(sender: UITapGestureRecognizer);
}

let delegate:FilterClickedDelegate?

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

我将该协议添加到viewcontroller类中,我还添加了协议所需的函数,但仍然会出现相同的错误。所以第一个问题:我在这个文件中使用协议是对的吗,因为它是在视图控制器上运行的?

第二个问题:我在选择器上做错了什么?在选择器中有提到协议函数的特定方法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-16 12:31:51

我知道了,在目标部分,初始化UITapGestureRecognizer时,您需要使用视图控制器,它实际上是委托者的委托。因此:

代码语言:javascript
复制
let tapGesture = UITapGestureController(target: vc, action:"filterClicked:");

谢谢大家,并希望这将有助于其他人在同一问题上!

干杯!

票数 0
EN

Stack Overflow用户

发布于 2016-03-16 02:39:23

邮政编码的最后一行:

代码语言:javascript
复制
(adjusted this line) let tapGesture = UITapGestureRecognizer(
             target: imgView, action: Selector("delegate.filterClicked:"));  

我认为应该是:

代码语言:javascript
复制
(adjusted this line) let tapGesture = UITapGestureRecognizer(
         target: delegate, action: Selector("filterClicked:"));  

我想它会成功的。

但我不建议这样做,这有点奇怪。我通常做的是:

代码语言:javascript
复制
(adjusted this line) let tapGesture = UITapGestureRecognizer(
         target: self, action: Selector("filterClicked:"));   

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

在ViewController中:

代码语言:javascript
复制
fun filterClicked() {
// delegate to do something
delegate.xxx()
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36025243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档