Swift:手势识别器无法识别的选择器发送到实例

Posted

技术标签:

【中文标题】Swift:手势识别器无法识别的选择器发送到实例【英文标题】:Swift: Gesture Recognizer unrecognized selector sent to instance 【发布时间】:2016-12-12 23:06:41 【问题描述】:

我正在尝试在 XCode 中制作手势识别器,以便我可以点击我的 MKMapView 并执行一些操作。但是,每当我长按地图时,我都会收到“发送到实例的无法识别的选择器”。

这是我在 viewDidLoad 中的代码:

let gestureRecognizer = UILongPressGestureRecognizer(target: self, action: "handleTap:");
self.mapViewPlace.addGestureRecognizer(gestureRecognizer);

这是稍后的功能:

func handleTap(gestureReconizer: UILongPressGestureRecognizer) 


有什么想法吗?

【问题讨论】:

请添加错误的完整措辞。错误通常会告诉你哪里出了问题,这就是它的用途。 尝试将 action:"handleTap" 改为 action:@selector("handleTap" Neo 很接近 - 它是 #selector,而不是 @selector。 我不希望您发布的代码能够在 Swift 3 中编译。动作的新语法是 action:#selector(selector_name),正如@dfd 在他的回答中所描述的那样。 是的。如果我可以添加评论,我们需要在这个网站上更好地区分 Swift 3 与否。 (那个。不是 Swift 2.x。) 【参考方案1】:

请给 Neo 信用。您需要将语法更改为:

let gestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(handleTap)

旁注:对于 Swift,您的代码行末尾不需要分号。

【讨论】:

这解决了问题,谢谢!出于某种原因,我在最新版本的 Swift 中找不到任何有关如何执行此操作的指南。也感谢 Neo 的帮助。 这仍然适用于 swift 4,感谢您的回答和正确的语法!【参考方案2】:

默认情况下,Swift 生成的代码仅对其他 Swift 代码可用,但如果您需要与 Objective-C 运行时(例如所有 UIKit)进行交互,您需要告诉 Swift 该做什么。

所以只需添加它并修改选择器声明:

@objc func handleTap(gestureReconizer: UILongPressGestureRecognizer) 
...

...
let swipe = UISwipeGestureRecognizer(target: self, action: #selector(handleTap(gestureReconizer:)))

【讨论】:

更多信息hackingwithswift.com/example-code/language/…

以上是关于Swift:手势识别器无法识别的选择器发送到实例的主要内容,如果未能解决你的问题,请参考以下文章

为我的点击手势发送到实例的无法识别的选择器

以编程方式添加视图和手势 - “发送到实例的无法识别的选择器”

快速代码崩溃:“发送到实例的无法识别的选择器”

Swift:发送到实例的无法识别的选择器

Swift 3 NSCoder 无法识别的选择器发送到实例

Swift无法识别的选择器发送到实例