2017-08-05 30 views
0

我想更新與當前時間的標籤。定時器問題呈現時間

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)

計時器不工作的結果。有人可以解釋我嗎? ?

從我的理解我,如果我用一個日期,而不是日期(),那麼我需要一個定時器/計數器計數和計算。如果有這樣的建議?

非常感謝

P

+3

'date'是一個恆定值。因此,即使每秒調用一次updateTime(),它也會每次將標籤設置爲相同的值。 – vacawama

+0

@ vacawama.Thanks很多。我怎麼能代表顯示從日期和每分鐘/秒等計數的標籤? –

+0

您是否試圖使標籤從'0:00'開始,然後每秒計數? – vacawama

回答

1

在你的第二個例子,date是一個恆定值。所以即使每秒都會調用updateTime(),它每次都會將標籤設置爲相同的值。

從評論,似乎要能提前當定時器運行一定的時間。

若要從任意constantDate開始計數,請在啓動計時器時存儲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,你可以避免一個視覺故障。