我如何在Swift中使用NSTimer?
我试过了
var timer = NSTimer() timer(timeInterval: 0.01, target: self, selector: update, userInfo: nil, repeats: false)
但是,我有一个错误说
'(timeInterval: $T1, target: ViewController, selector: () -> (), userInfo: NilType, repeats: Bool) -> $T6' is not identical to 'NSTimer'
这将工作:
override func viewDidLoad() { super.viewDidLoad() //Swift >=3 selector syntax var timer = Timer.scheduledTimer(timeInterval: 0.4, target: self, selector: #selector(self.update), userInfo: nil, repeats: true) //Swift 2.2 selector syntax var timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: #selector(MyClass.update), userInfo: nil, repeats: true) //Swift <2.2 selector syntax var timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: "update", userInfo: nil, repeats: true) } // must be internal or public. @objc func update() { // Something cool }
对于Swift 4来说,你想得到select器的方法必须暴露给Objective-C,因此@objc
属性必须被添加到方法声明中。
Swift 3更新了一些更完整的例子。
重复的事件
您可以使用计时器多次执行操作,如以下示例所示。 计时器调用每半秒更新一次标签的方法。
这是这个代码:
import UIKit class ViewController: UIViewController { var counter = 0 var timer = Timer() @IBOutlet weak var label: UILabel! // start timer @IBAction func startTimerButtonTapped(sender: UIButton) { timer.invalidate() // just in case this button is tapped multiple times // start the timer timer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(timerAction), userInfo: nil, repeats: true) } // stop timer @IBAction func cancelTimerButtonTapped(sender: UIButton) { timer.invalidate() } // called every time interval from the timer func timerAction() { counter += 1 label.text = "\(counter)" } }
延迟的事件
您还可以使用计时器在将来一段时间安排一次性事件。 与上面的例子的主要区别是你使用repeats: false
而不是true
。
timer = Timer.scheduledTimer(timeInterval: 2.0, target: self, selector: #selector(delayedAction), userInfo: nil, repeats: false)
上面的例子在定时器被设置两秒后调用一个名为delayedAction
的方法。 这是不重复的,但是如果你需要在事件发生之前取消事件,你仍然可以调用timer.invalidate()
。
笔记
- 如果有多次启动计时器实例的机会,请确保先使旧计时器实例无效。 否则,你会失去对定时器的引用,你不能再停下来了。 (见本问答 )
- 当不需要时不要使用定时器。 请参阅iOS应用程序能源效率指南的计时器部分。
有关
- 如何在Swift中处理date和时间
没有人需要用户信息?
var timer: NSTimer? startTimer() { timer = NSTimer.scheduledTimerWithTimeInterval(5, target: self, selector: "event:", userInfo: ["custom":"data"], repeats: true) } } func event(timer: NSTimer!) { let info = timer.userInfo print(info) }
从iOS 10开始,还有一个新的基于块的Timer工厂方法比使用select器更清晰:
_ = Timer.scheduledTimer(withTimeInterval: 5, repeats: false) { timer in label.isHidden = true }
请检查:
var timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: Selector("update"), userInfo: nil, repeats: true);
Swift 3,iOS 10之前
func schedule() { DispatchQueue.main.async { self.timer = Timer.scheduledTimer(timeInterval: 20, target: self, selector: #selector(self.timerDidFire(timer:)), userInfo: nil, repeats: false) } } @objc private func timerDidFire(timer: Timer) { print(timer) }
Swift 3,iOS 10+
DispatchQueue.main.async { self.timer = Timer.scheduledTimer(withTimeInterval: 20, repeats: false) { timer in print(timer) } }
笔记
- 它需要在主队列上
- callback函数可以是公共的,私人的,…
- callback函数需要是
@objc
你将需要在Swift 3中使用Timer而不是NSTimer。
这里是一个例子:
Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(YourController.update), userInfo: nil, repeats: true) func update() { // do what should happen when timer triggers an event }
对于Swift 3和Xcode 8.2(很好有块,但是如果你为iOS9编译并且想要userInfo):
…
self.timer = Timer(fireAt: fire, interval: deltaT, target: self, selector: #selector(timerCallBack(timer:)), userInfo: ["custom":"data"], repeats: true) RunLoop.main.add(self.timer!, forMode: RunLoopMode.commonModes) self.timer!.fire() } func timerCallBack(timer: Timer!){ let info = timer.userInfo print(info) }
在Swift 3中 ,像@objc这样的东西:
func startTimerForResendingCode() { let timerIntervalForResendingCode = TimeInterval(60) Timer.scheduledTimer(timeInterval: timerIntervalForResendingCode, target: self, selector: #selector(timerEndedUp), userInfo: nil, repeats: false) } @objc func timerEndedUp() { output?.timerHasFinishedAndCodeMayBeResended() }
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(createEnemy), userInfo: nil, repeats: true)
并通过名称创build乐趣createEnemy
fund createEnemy () { do anything //// }
SimpleTimer(Swift 3.1)
为什么?
这是一个简单的计时器类在迅速,使您能够:
- 本地作用域计时器
- 可链接
- 一个内衬
- 使用常规的callback
用法:
SimpleTimer(interval: 3,repeats: true){print("tick")}.start()//Ticks every 3 secs
码:
class SimpleTimer {/*<--was named Timer, but since swift 3, NSTimer is now Timer*/ typealias Tick = ()->Void var timer:Timer? var interval:TimeInterval /*in seconds*/ var repeats:Bool var tick:Tick init( interval:TimeInterval, repeats:Bool = false, onTick:@escaping Tick){ self.interval = interval self.repeats = repeats self.tick = onTick } func start(){ timer = Timer.scheduledTimer(timeInterval: interval, target: self, selector: #selector(update), userInfo: nil, repeats: true)//swift 3 upgrade } func stop(){ if(timer != nil){timer!.invalidate()} } /** * This method must be in the public or scope */ @objc func update() { tick() } }
如果你初始化定时器的方法
let timer = Timer(timeInterval: 3, target: self, selector: #selector(update(_:)), userInfo: [key : value], repeats: false) func update(_ timer : Timer) { }
然后将其添加到循环使用方法其他select器将不会被调用
RunLoop.main.add(timer!, forMode: .defaultRunLoopMode)
注:如果你想这个重复使重复真正的和保持定时器的引用,否则更新方法将不会被调用。
如果你正在使用这种方法。
Timer.scheduledTimer(timeInterval: seconds, target: self, selector: #selector(update(_:)), userInfo: nil, repeats: true)
如果重复是真的,请保留以备后用。
- 如何将tintColor应用于UIImage?
- iOS版存档时未findPhonegap CDVViewController.h文件
- 在iPhone上的MapKit的两点之间寻找path/路线
- 这个证书有一个无效的发行者:钥匙串标记所有的证书为“无效的发行者”
- UIKeyboardBoundsUserInfoKey已弃用,请改用什么?
- 寻找在UIScrollView滚动的方向?
- 为UIAlertAction编写处理程序
- 我在哪里可以find一个CSV到Objective-C的NSArrayparsing器?
- 尝试在其视图不在窗口层次结构中的UIViewController上呈现UIViewController