- 使用更新信息进行编辑 -
我想做的是使用timerFunc
方法每五秒调用一次名为NSTimer.scheduledTimerWithTimeInterval
的函数,问题似乎是在运行时,我收到错误
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-
[Animation.ViewController timerFunc:]: unrecognized selector sent to instance 0x7fe548d66040'
在输出日志中。我一直在寻找其他人的NSTimers无济于事,我看到有不少选择器为selector: Selector("timerFunc:")
而不是selector: Selector("timerFunc")
两种方式,但是,给出错误。另一件事是timerFunc函数和NSTimer都在viewDidLoad中,有什么问题吗?非常感谢对这个问题的任何见解,感谢阅读。
下面的timerFunc
func timerFunc(){
println("Timer")
}
下面的NSTimer
NSTimer.scheduledTimerWithTimeInterval(
5.0,
target: self,
selector: Selector("timerFunc"),
userInfo: nil,
repeats: true)
答案 0 :(得分:11)
定时器不适用于私有方法回调。此外,确保您的类继承自NSObject 。 Pure Swift类不起作用。
可在此处找到更多信息:https://github.com/NxSoftware/NxSwiftTimer
答案 1 :(得分:9)
另一件事是timerFunc函数和NSTimer都在viewDidLoad中,是否有任何问题?
是。那是你的问题。 timerFunc
无法嵌套在viewDidLoad
内,它必须是与viewDidLoad
同级别的顶级函数。
class ViewController: UIViewController {
override func viewDidLoad() {
....
NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: "timerFunc", userInfo: nil, repeats: true)
}
func timerFunc() {
println("Timer")
}
}
当计时器触发时,它将调用目标指定的对象上的选择器指定的函数。也就是说,它会调用self.timerFunc()
。当timerFunc()
嵌套在ViewDidLoad
内时,它无法找到它。
答案 2 :(得分:3)
我的问题是选择器指向一个私有函数。
答案 3 :(得分:2)
Swift方法的第一个参数不包含标签。其他所有人都这样做。您应该期望语法为:
NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: "timerFunc", userInfo: nil, repeats: true)
答案 4 :(得分:1)
在Swift中使用选择器时,您需要在函数名称周围使用 Selector()伪函数:
NSTimer.scheduledTimerWithTimeInterval(5.0, target: self,
selector: Selector("timerFunc"),
userInfo: nil,
repeats: true);
我怀疑看似混乱的错误的原因是由于编译器无法将您的参数列表与特定方法匹配,因为选择器名称的类型错误(字符串而不是选择器)。
这也解释了这样一个事实:当你设法让它进行编译时(如评论中提到的另一个答案),它在运行时失败了。编译时的类型检查无法获取此类错误(因此报告'无法识别的选择器'的运行时异常)。