在 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 中包含应用内图标选择器?
在 MVC Web 应用程序中包含 Jquery 时间选择器的步骤