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谢谢,我一到办公桌就会更新答案。