使用Timer时未实现methodSignatureForSelector和无法识别的选择器

时间:2018-11-03 23:54:42

标签: swift timer nstimer

这里有一个简单的类,每秒可多次打印“ test”:

import Foundation

class TestClass {

    static var count = 0
    static var timer = Timer()

    init() {
        TestClass.start()
    }

    static func start() {
        TestClass.timer = Timer.scheduledTimer(timeInterval: 1.0/5.0, target: self, selector: #selector(printTest), userInfo: nil, repeats: true)
    }

    @objc func printTest() {
        print(count)
        count += 1
    }
}

我将函数start设置为变量timer static,以便以后可以从另一个类启动和停止计时器

在我的主要ViewController文件中,我只是说了一个新的TestClass

let _ = TestClass()

然后我尝试通过以下方式停止并启动计时器:

if /*something*/ {
    TestClass.timer.invalidate()
}

if /*something else*/ {
    TestClass.start()
}

但是,当我运行项目时,控制台中出现多个错误:

NSForwarding: warning: object 0x10eaab580 of class 'DeleteMe.TestClass' does not implement methodSignatureForSelector: -- trouble ahead

Unrecognized selector +[DeleteMe.TestClass printTest]

我需要在课堂上修改某些内容来解决错误吗?

1 个答案:

答案 0 :(得分:0)

问题在于startstatic方法,因此self是类,而不是实例。这意味着printTest也必须是static

但是为什么这些是静态的?为什么创建一个仅调用静态start方法的实例?

摆脱init,只需使用TestClass.start()

或将所有内容设置为适当的实例属性和实例方法。然后,您可以为每个TestClass各自的计时器创建单独的实例。