2014-11-14 20 views
4

我是新來的swift(和一般編程),現在我正在開發一個項目,我想在一個標籤中顯示一個時鐘。如何獲取日期和時間來顯示UILabel中的時鐘

現在我有這個在我的模型:

class CurrentDateAndTime { 

let currentTime = NSDateFormatter.localizedStringFromDate(NSDate(), dateStyle: .MediumStyle, timeStyle: .MediumStyle) 
} 

,然後用這個代碼在我的視圖控制器打電話到標籤:

@IBOutlet weak var currentTimeLabel: UILabel! 

let currentTime = CurrentDateAndTime() 



override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    currentTimeLabel.text = currentTime.currentTime 
} 

問題是這樣的不更新在第二個時間間隔顯示實際時間。最終,我將需要在兩個時間戳之間找出差異,以便我可以在「開始時間」和「停止時間」之間記錄小時。這甚至是最好的/最簡單的方法嗎?任何關於我的目標的線索都將非常感激。

回答

6

使用NSTimer你所需的間隔來安排回調 - 在這種情況下,

  • 呼叫tick()self每秒
  • tick()抓取當前時間串並更新UILabel

    class MyViewController { 
        @IBOutlet weak var currentTimeLabel: UILabel! 
    
        var timer = NSTimer() 
    
        override func viewDidLoad() { 
         super.viewDidLoad() 
    
         // Do any additional setup after loading the view, typically from a nib. 
    
         timer = NSTimer.scheduledTimerWithTimeInterval(1.0 
                      target: self, 
                      selector: #selector(tick),  
                      userInfo: nil, 
                      repeats: true) 
        } 
    
        @objc func tick() { 
         currentTimeLabel.text = NSDateFormatter.localizedStringFromDate(NSDate(), 
                         dateStyle: .MediumStyle, 
                         timeStyle: .MediumStyle) 
        } 
    } 
    

雨燕4.0更新:

class MyViewController : UIViewController { 
    @IBOutlet weak var currentTimeLabel: UILabel! 

    var timer = Timer() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector:#selector(self.tick) , userInfo: nil, repeats: true) 
    } 

    @objc func tick() { 
     currentTimeLabel.text = DateFormatter.localizedString(from: Date(), 
                   dateStyle: .medium, 
                   timeStyle: .medium) 
    } 
} 
+0

我不知道我做錯了什麼,但標籤仍然沒有更新上1.0秒間隔。我運行應用程序時,是否應該能夠在間隔時間內看到標籤更新? – Leighton 2014-11-14 14:21:23

+0

對不起 - 錯過了您的'CurrentDateAndTime'類僅將一次常量計算爲'當前'日期/時間;更新了我的答案,以便在每個「tick」上做;你應該根據需要重構。 – 2014-11-14 14:36:19

+0

太棒了!那工作。謝謝 – Leighton 2014-11-14 14:59:17

6

這是一個較新(2016)斯威夫特例如:

import Cocoa 

class ViewController: NSViewController { 
    @IBOutlet weak var labelClock: NSTextField! 
    let dateFormatter = DateFormatter() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view. 
     dateFormatter.dateStyle = .medium 
     dateFormatter.timeStyle = .long 
     Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateLabel), userInfo: nil, repeats:true); 
    } 

    override var representedObject: Any? { 
     didSet { 
      // Update the view, if already loaded. 
     } 
    } 


    func updateLabel() -> Void { 
     labelClock.stringValue = dateFormatter.string(from: Date()); 
    } 
} 
相關問題