【问题标题】:How initialize a Timer inside a custom class in Swift? [duplicate]如何在 Swift 的自定义类中初始化 Timer? [复制]
【发布时间】:2016-09-21 17:14:35
【问题描述】:

我做了一个简单的 cronometer 应用程序,但是,现在我想让它变得更好,我想为 cronometer 控件编写一个类:

class Cronometer{
    private var counter:Int = 0
    private var timer:Timer = Timer()
    private var state:Bool = true

   func initCronometer(){
        if self.state{
            self.timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: Selector("onTick"), userInfo: nil, repeats: true)
        }else{
            self.timer.invalidate()
        }
        self.state = !self.state
    }

    func onTick(){
        self.counter += 1
        print(self.counter)
    }
}

但是选择器参数在使用自定义方法的类中不起作用。我不希望它在 ViewController 中,就像我之前所做的那样。

我试试

self.timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: Selector(("onTick")), userInfo: nil, repeats: true)

self.timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(self.onTick), userInfo: nil, repeats: true)

...但仍然无法正常工作

那么,在 Timer 初始化程序中将类方法分配为选择器的最佳方法是什么?

非常感谢!

【问题讨论】:

    标签: ios swift timer swift3


    【解决方案1】:

    Timer 是基础类型NSTimer 的覆盖类型, 它使用 Objective-C 消息传递来调用计时器目标。 因此目标方法必须在 Objective-C 中可用。

    您有以下选择:

    • 只用@objc 标记onTick() 方法(正如Matt 已经说过的那样)。
    • 使Cronometer 类成为NSObject 的子类。
    • 在 iOS 10/macOS 10.12 上,您可以使用更新的基于块的计时器 API:

      self.timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) {
         _ in self.onTick()
      }
      

    【讨论】:

    • 我选择这个答案是为了得到很酷的解释。谢谢
    【解决方案2】:

    声明@objc func onTick(),一切都会好起来的。

    【讨论】:

    • 谢谢,它正在使用它
    猜你喜欢
    • 2015-01-11
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多