为了账号安全,请及时绑定邮箱和手机立即绑定

如何在Swift中使用NSTimer?

如何在Swift中使用NSTimer?

米琪卡哇伊 2019-07-29 16:02:27
如何在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'
查看完整描述

3 回答

?
红糖糍粑

TA贡献1815条经验 获得超6个赞

更新到Swift 4,利用userInfo:

class TimerSample {

    var timer: Timer?

    func startTimer() {
        timer = Timer.scheduledTimer(timeInterval: 5.0,
                                     target: self,
                                     selector: #selector(eventWith(timer:)),
                                     userInfo: [ "foo" : "bar" ],
                                     repeats: true)
    }

    // Timer expects @objc selector    @objc func eventWith(timer: Timer!) {
        let info = timer.userInfo as Any
        print(info)
    }}


查看完整回答
反对 回复 2019-07-29
?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

这将有效:


override func viewDidLoad() {

    super.viewDidLoad()

    // Swift block syntax (iOS 10+)

    let timer = Timer(timeInterval: 0.4, repeats: true) { _ in print("Done!") }

    // Swift >=3 selector syntax

    let timer = Timer.scheduledTimer(timeInterval: 0.4, target: self, selector: #selector(self.update), userInfo: nil, repeats: true)

    // Swift 2.2 selector syntax

    let timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: #selector(MyClass.update), userInfo: nil, repeats: true)

    // Swift <2.2 selector syntax

    let 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,您希望获取选择器的方法必须公开给Objective-C,因此@objc必须将属性添加到方法声明中。


查看完整回答
反对 回复 2019-07-29
?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

重复的事件

您可以使用计时器多次执行操作,如以下示例所示。计时器调用一种方法每半秒更新一次标签。

这是代码:

import UIKitclass 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应用能源效率指南”中的计时器部分。

有关


查看完整回答
反对 回复 2019-07-29
  • 3 回答
  • 0 关注
  • 1115 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信