我试图在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”错误。
当使用performSelector()时
/addtarget()/NStimer.scheduledTimerWithInterval()方法你的方法(匹配选择器)应该被标记为
@objc
For Swift 2.0:
{
//...
self.performSelector(“performMethod”, withObject: nil , afterDelay: 0.5)
//...
//...
btnHome.addTarget(self, action: “buttonPressed:", forControlEvents: UIControlEvents.TouchUpInside)
//...
//...
NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector : “timerMethod”, userInfo: nil, repeats: false)
//...
}
@objc private func performMethod() {
…
}
@objc private func buttonPressed(sender:UIButton){
….
}
@objc private func timerMethod () {
….
}
对于Swift 2.2,
你需要写“#selector()”而不是字符串和选择器名称,这样拼写错误和崩溃的可能性就不会再存在了。下面是示例
self.performSelector(#selector(MyClass.performMethod), withObject: nil , afterDelay: 0.5)
objective - c选择器
Selector标识一个方法。
//Compile time
SEL selector = @selector(foo);
//Runtime
SEL selector = NSSelectorFromString(@"foo");
例如
[object sayHello:@"Hello World"];
//sayHello: is a selector
selector是一个来自Objective-C世界的词,你可以从Swift中使用它,有可能从Swift中调用Objective-C,它允许你在运行时执行一些代码
在Swift 2.2之前,语法是:
Selector("foo:")
因为函数名是作为字符串参数("foo")传入Selector的,所以在编译时不可能检查名称。结果你会得到一个运行时错误:
unrecognized selector sent to instance
在Swift 2.2+之后,语法是:
#selector(foo(_:))
Xcode的自动完成功能帮助你调用正确的方法
创建如下所示的选择器。
1.
UIBarButtonItem(
title: "Some Title",
style: UIBarButtonItemStyle.Done,
target: self,
action: "flatButtonPressed"
)
2.
flatButton.addTarget(self, action: "flatButtonPressed:", forControlEvents: UIControlEvents.TouchUpInside)
注意,@selector语法消失了,取而代之的是一个简单的String来命名要调用的方法。有一个方面,我们都同意冗长是一个障碍。当然,如果我们声明有一个名为flatButtonPressed的目标方法:我们最好写一个:
func flatButtonPressed(sender: AnyObject) {
NSLog("flatButtonPressed")
}
设置定时器:
var timer = NSTimer.scheduledTimerWithTimeInterval(1.0,
target: self,
selector: Selector("flatButtonPressed"),
userInfo: userInfo,
repeats: true)
let mainLoop = NSRunLoop.mainRunLoop() //1
mainLoop.addTimer(timer, forMode: NSDefaultRunLoopMode) //2 this two line is optinal
为了完整,这里是flatButtonPressed
func flatButtonPressed(timer: NSTimer) {
}