我有一个Swift项目,我想在其中将方法附加到UIButton的tap事件。我有以下代码:
class MyClass { let myButton = UIButton(frame: CGRectMake(50, 50, 100, 50)) init() { myButton.addTarget(self, #selector(self.didTap(_:)), forControlEvents: .TouchUpInside) } func didTap(sender: UIButton) { print("Tapped") } }
XCode突出显示了我的addTarget说法,并说:
addTarget
Argument of '#selector' refers to a method that is not exposed to Objective-C
如果我@objc按我的func didTap建议添加前缀,则说明一切正常。
@objc
func didTap
我的构建设置中是否启用了某些导致这种奇怪行为的功能?
PS。我在7.3.1中得到了这种行为。但是,如果我在7.2.1中尝试此方法,则它不接受#selector(method(_:))语法,并且Selector("method:")工作正常。
#selector(method(_:))
Selector("method:")
选择器是Objective-C的功能,只能与动态Obj-C运行时公开的方法一起使用。您不能为纯Swift方法选择器。
如果您的类继承自该类,NSObject则其公共方法将自动暴露给Obj-C。由于您的类没有继承自您的类,因此NSObject您必须使用@objc属性来指示您希望将此方法公开给Obj-C,以便可以使用Obj- C选择器对其进行调用。
NSObject
#selector()是Swift 2.2中的新语法。它允许编译器检查您要使用的选择器是否确实存在。旧的语法已被弃用,并将在Swift 3.0中删除。
#selector()