Swift 斯威夫特:“我的名字叫什么?”;已将无法识别的选择器发送到实例";,代码9.4.1

Swift 斯威夫特:“我的名字叫什么?”;已将无法识别的选择器发送到实例";,代码9.4.1,swift,uitapgesturerecognizer,unrecognized-selector,xcode9.4,Swift,Uitapgesturerecognizer,Unrecognized Selector,Xcode9.4,有人能帮我吗 override func viewDidLoad() { super.viewDidLoad() tableView.delegate=self tableView.dataSource=self searchBar.autocorrectionType = .yes searchBar.delegate=self searchBarView.translatesAutoresizingMaskIntoConstraints=fal

有人能帮我吗

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.delegate=self
    tableView.dataSource=self
    searchBar.autocorrectionType = .yes
    searchBar.delegate=self
    searchBarView.translatesAutoresizingMaskIntoConstraints=false

    let tap:UIGestureRecognizer = UITapGestureRecognizer(target: self, action: Selector(("tapCancel:")))

    searchBarView.addGestureRecognizer(tap)
    tableView.addGestureRecognizer(tap)
    tableView.isUserInteractionEnabled=true
}
...
func tapCancel(sender:UITapGestureRecognizer){
    hideSearchBarView()
    isSearchon=false
    print("Tap cancel!")
}
每次我点击视图,它都会崩溃。 “已将无法识别的选择器发送到实例0x7feb85d109e0”

我将感谢任何帮助!
谢谢

我认为原因在于方法名称如何在Swift和Objective-C之间映射,这是Cocoa实现和整个目标/行动机制的基础

在您的情况下,Swift方法

@objc func tapCancel(sender:UITapGestureRecognizer)
…对应于Objective-C选择器:

-tapCancelWithSender:
注意:为了使用目标/操作范例(即通过选择器调用),需要将该方法声明为
@objc
。可选属性
@IBOutlet
(与Interface Builder配合使用)也支持此功能。(帽尖指向@rmaddy)

要删除“Wissender”部分并获得与
点击Cancel:
匹配的选择器,您需要告诉Swift删除参数标签
发送者
,如下所示:

func tapCancel(_ sender:UITapGestureRecognizer) // Notice the underscore (_)
此外,根据@dan的评论,或许您可以使用:

#selector(self.tapCancel(_:))
或者更简洁地说,正如(再次感谢)@rmaddy所指出的,只是:

#selector(tapCancel)
(Xcode将尝试将其自动完成到
#选择器(点击Cancel(:)
,但较短的语法也可以,并且方法名称会突出显示)

我不熟悉您使用的
Selector()
语法,所以我试着用它玩了一会儿,结果发现:

(选择器与编译器可以“看到”的任何方法都不匹配)

(在添加“withSender”之后,编译器可以匹配该方法,但它建议使用更好的
#选择器(…
语法)

正如@rmaddy在评论中指出的,使用较短的
#选择器(doSomething)
语法(无冒号、无下划线、无
self
)也解决了是否需要“with sender”的问题。

使用

点击:UIGestureRecognizer=UITapGestureRecognizer(目标:自我,操作:#选择器(点击取消))

而不是

让点击:UIGestureRecognizer=UITapGestureRecognizer(目标:自我,操作:选择器((“点击取消:))


在方法
点击取消()之前添加
@objc

使用
#选择器(点击取消)
而不是从字符串创建它您只需要
#选择器(点击取消)
。您不需要在
发送方
参数之前添加
\uucode>。您需要在
函数点击取消之前添加
@objc
@rmaddy谢谢,我一到办公桌就会更新答案。