Having trouble with NSTimer (Swift)

半腔热情 提交于 2019-12-05 17:44:19

问题


--EDITED WITH UPDATED INFORMATION--

What I wish to do is call a function named timerFunc once every five seconds using a NSTimer.scheduledTimerWithTimeInterval method, the issue seems is that during runtime, I get the error

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-      
[Animation.ViewController timerFunc:]: unrecognized selector sent to instance 0x7fe548d66040'

In the output log. I've been looking up other people's NSTimers to no avail, I see quite a few have the selector as selector: Selector("timerFunc:") instead of selector: Selector("timerFunc") both ways, however, give the error. Another thing is that both the timerFunc function and the NSTimer are inside of viewDidLoad, are there any issues with that? Any insight on the problem is greatly appreciated, thanks for reading.

timerFunc below

func timerFunc(){

    println("Timer")
}

NSTimer below

NSTimer.scheduledTimerWithTimeInterval(
        5.0,
        target: self,
        selector: Selector("timerFunc"),
        userInfo: nil,
        repeats: true)

回答1:


Another thing is that both the timerFunc function and the NSTimer are inside of viewDidLoad, are there any issues with that?

Yes. That is your problem. The timerFunc can't be nested inside of viewDidLoad, it must be a top level function at the same level as viewDidLoad.

class ViewController: UIViewController {

    override func viewDidLoad() {
        ....
        NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: "timerFunc", userInfo: nil, repeats: true)
    }

    func timerFunc() {
        println("Timer")
    }

}

When the timer fires, it will call the function specified by the selector on the the object designated by target. That is, it will call self.timerFunc(). When your timerFunc() is nested inside of ViewDidLoad, it can't find it.




回答2:


Timers will not work with private method callbacks. Also, make sure your class inherits from NSObject. Pure Swift classes will not work.

More information can be found here: https://github.com/NxSoftware/NxSwiftTimer




回答3:


My problem with this was the selector was pointing at a private function.




回答4:


The first parameter of a Swift method does not include a label. All others generally do. You should expect the syntax to be:

NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: "timerFunc", userInfo: nil, repeats: true)



回答5:


When using a selector in Swift you need to use the Selector() pseudo-function around the name of the function:

NSTimer.scheduledTimerWithTimeInterval(5.0,   target: self, 
                                            selector: Selector("timerFunc"), 
                                            userInfo: nil,
                                             repeats: true);

The reason for the seemingly confusing errors I suspect is due to the compilers inability to match your argument list to a particular method, due to the selector name being of the wrong type (string rather than selector).

This also explains the fact that when you did manage to get it to compile (as mentioned in the comments to another answer) it failed at runtime. The type checking at compile time fails to pick up this sort of error (hence the runtime exception reporting the 'unrecognized selector').



来源:https://stackoverflow.com/questions/25838752/having-trouble-with-nstimer-swift

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!