在 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:");
谢谢大家,希望这能帮助其他陷入同样问题的人!
干杯!
我有一个 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:");
谢谢大家,希望这能帮助其他陷入同样问题的人!
干杯!