如何在 Swift 的自定义类中初始化 Timer? [复制]
Posted
技术标签:
【中文标题】如何在 Swift 的自定义类中初始化 Timer? [复制]【英文标题】:How initialize a Timer inside a custom class in Swift? [duplicate] 【发布时间】: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 初始化程序中将类方法分配为选择器的最佳方法是什么?
非常感谢!
【问题讨论】:
【参考方案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()
,一切都会好起来的。
【讨论】:
谢谢,它正在使用它以上是关于如何在 Swift 的自定义类中初始化 Timer? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
在 Swift 项目中使用 Objective C 类中的 Swift 类