在这种情况下,永远不会调用timerFunc().我错过了什么?
class AppDelegate: NSObject, NSApplicationDelegate {
var myTimer: NSTimer? = nil
func timerFunc() {
println("timerFunc()")
}
func applicationDidFinishLaunching(aNotification: NSNotification?) {
myTimer = NSTimer(timeInterval: 5.0, target: self, selector:"timerFunc", userInfo: nil, repeats: true)
}
}
Run Code Online (Sandbox Code Playgroud)
Rya*_*yan 92
您可以创建一个计划的计时器,它自动将自己添加到runloop并开始触发:
NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: "timerDidFire:", userInfo: userInfo, repeats: true)
Run Code Online (Sandbox Code Playgroud)
或者,您可以保留当前代码,并在准备好时将计时器添加到runloop:
Timer.scheduledTimer(withTimeInterval: 0.5, target: self, selector: #selector(timerDidFire(_:)), userInfo: userInfo, repeats: true)
Run Code Online (Sandbox Code Playgroud)
我对卢克采用了类似的方法.只有对"私人方法"纯粹主义者的警告:
不要在Swift中私有回调.
如果你写:
private func timerCallBack(timer: NSTimer){
Run Code Online (Sandbox Code Playgroud)
..
你会得到:
timerCallBack:]:无法识别的选择器发送到实例...由于未捕获的异常'NSInvalidArgumentException'终止应用程序
除非您使用NSTimer.scheduledTimerWithTimeInterval以下内容,否则不会自动安排NSTimer :
myTimer = NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: "timerFunc", userInfo: nil, repeats: true)
Run Code Online (Sandbox Code Playgroud)
正如Drewag和Ryan指出的那样,你需要创建一个预定的计时器(或自己安排)最简单的方法是创建它已安排好的计划:
myTimer = NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: "timerFunc:", userInfo: nil, repeats: true)
Run Code Online (Sandbox Code Playgroud)
您还需要更改timerFunc(和关联的选择器)的定义以获取参数并以":"结束
func timerFunc(timer:NSTimer!) {
...
}
Run Code Online (Sandbox Code Playgroud)
对于Swift 3
var timer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(ViewController.updateTimer), userInfo: nil, repeats: true);
RunLoop.current.add(timer, forMode: RunLoopMode.commonModes)
Run Code Online (Sandbox Code Playgroud)
运行循环的Swift 3.0语法:
RunLoop.current.add(myTimer, forMode: .commonModes)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
51602 次 |
| 最近记录: |