我试图在Swift中创建一个NSTimer,但我遇到了一些麻烦。
NSTimer(timeInterval: 1, target: self, selector: test(), userInfo: nil, repeats: true)
Test()是同一个类中的一个函数。
我在编辑器中得到一个错误:
无法找到一个超载的'init'接受提供的
参数
当我把selector: test()改为selector: nil时,错误就消失了。
我试过了:
选择器:测试()
选择器:测试
选择器:选择器(测试())
但是什么都没用,我在参考文献中找不到解决方案。
同样,如果你的(Swift)类不是来自Objective-C类,那么你必须在目标方法名称字符串的末尾有一个冒号,你必须使用@objc属性与你的目标方法,例如。
var rightButton = UIBarButtonItem(title: "Title", style: UIBarButtonItemStyle.Plain, target: self, action: Selector("method"))
@objc func method() {
// Something cool here
}
否则你会在运行时得到一个“unrecognized Selector”错误。
只是为了以防别人有同样的问题,我与NSTimer没有其他答案固定的问题,是真正重要的提到,如果你正在使用一个类,不继承从NSObject直接或深层的层次结构(例如。手动创建的swift文件),其他答案都不会工作,即使指定如下:
let timer = NSTimer(timeInterval: 1, target: self, selector: "test",
userInfo: nil, repeats: false)
func test () {}
除了从NSObject继承类之外,没有改变任何其他东西,我停止了“Unrecognized selector”错误,并让我的逻辑按预期工作。
我发现很多答案都很有用,但我不清楚如何用一个不是按钮的东西来做到这一点。我在swift中添加了一个手势识别器到UILabel中,所以在阅读以上所有内容后,我发现以下是对我有用的:
let tapRecognizer = UITapGestureRecognizer(
target: self,
action: "labelTapped:")
其中“Selector”被声明为:
func labelTapped(sender: UILabel) { }
请注意,它是公共的,我没有使用Selector()语法,但也可以这样做。
let tapRecognizer = UITapGestureRecognizer(
target: self,
action: Selector("labelTapped:"))
选择器是Objective-C中方法名的内部表示。在Objective-C中,“@selector(methodName)”会将一个源代码方法转换为SEL的数据类型。因为你不能在Swift中使用@selector语法(里克斯特就在这里),你必须手动指定方法名直接作为String对象,或者通过传递String对象给Selector类型。这里有一个例子:
var rightBarButton = UIBarButtonItem(
title: "Logout",
style: UIBarButtonItemStyle.Plain,
target: self,
action:"logout"
)
or
var rightBarButton = UIBarButtonItem(
title: "Logout",
style: UIBarButtonItemStyle.Plain,
target: self,
action:Selector("logout")
)