在Swift中使用NSTimer

Rob*_*eph 42 nstimer swift

在这种情况下,永远不会调用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)

  • Swift3`RunLoop.current.add(timer,forMode:RunLoopMode.commonModes)` (3认同)

ing*_*nti 8

我对卢克采用了类似的方法.只有对"私人方法"纯粹主义者的警告:

不要在Swift中私有回调.

如果你写:

private func timerCallBack(timer: NSTimer){
Run Code Online (Sandbox Code Playgroud)

..

你会得到:

timerCallBack:]:无法识别的选择器发送到实例...由于未捕获的异常'NSInvalidArgumentException'终止应用程序

  • 只需将``@ objc``添加到私有方法中它也可以工作:``@objc private func timerCallBack(timer:NSTimer){`` (4认同)

dre*_*wag 7

除非您使用NSTimer.scheduledTimerWithTimeInterval以下内容,否则不会自动安排NSTimer :

myTimer = NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: "timerFunc", userInfo: nil, repeats: true)
Run Code Online (Sandbox Code Playgroud)


Dav*_*rry 6

正如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)

  • 您不需要定义它来进行参数.无论哪种方式都没关系. (2认同)

Cha*_*yam 6

对于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)

  • 使用 `scheduledTimer()` 方法会自动将你的 Timer 添加到 runloop - 你不需要手动添加它。 (2认同)

Flo*_*giu 5

运行循环的Swift 3.0语法:

RunLoop.current.add(myTimer, forMode: .commonModes)
Run Code Online (Sandbox Code Playgroud)