定时器问题呈现时间

时间:2017-08-05 21:16:42

标签: ios swift timer dateformatter

我正在尝试使用当前时间更新标签。

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var label: UILabel!
    let date = Date()

    override func viewDidLoad() {
        super.viewDidLoad()

        Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateTime), userInfo: nil, repeats: true)
    }


    func updateTime(){

        label.text = DateFormatter.localizedString(from: Date(), dateStyle: .none, timeStyle: .long)

    }


}

当我在updateTime() label.text = DateFormatter.localizedString(from: Date(), dateStyle: .none, timeStyle: .long)使用时,我得到了我想要的结果

当我使用label.text = DateFormatter.localizedString(from: date, dateStyle: .none, timeStyle: .long)

计时器无法正常工作。有人可以解释一下吗? ?

根据我的理解,如果我使用日期而不是Date(),那么我需要一个计时器/计数器来计算和计算。如有任何建议?

非常感谢

P

1 个答案:

答案 0 :(得分:1)

在第二个示例中,date是一个常量值。因此,即使每秒调用updateTime(),它每次都会将标签设置为相同的值。

从评论中,您似乎希望能够在计时器运行时提前一段时间。

要从任意constant Date开始计数,请在计时器启动时存储start次。用它来计算计时器已运行的interval,然后使用interval推进date

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var label: UILabel!
    let date = Date()
    var start: Date?

    override func viewDidLoad() {
        super.viewDidLoad()

        // Save the time when the timer starts 
        start = Date()

        Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateTime), userInfo: nil, repeats: true)
    }


    func updateTime(){

        // compute how long the timer has been running
        let interval = Date().timeIntervalSince(start!)

        // compute new date based on how long the timer has been running
        let newDate = date.addingTimeInterval(interval)
        label.text = DateFormatter.localizedString(from: newDate, dateStyle: .none, timeStyle: .long)

    }
}

计时器触发不是很准确,您可能会看到计数暂停一秒钟然后再跳2秒。如果你让你的计时器间隔更小,比如0.1,你可以避免视觉故障。