0

My time label is displaying the time, when I open my app but it won't update it live. I had a look at other answers but they didn't make sense.

// CURRENT TIME

    @IBOutlet weak var currentTimeLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        getCurrentTime()
    }

// FORMAT TIME

func getCurrentTime(){
        let formatter = DateFormatter()
        formatter.dateFormat = "hh:mm"
        let str = formatter.string(from: Date())
        currentTimeLabel.text = str
    }

I want my app to update the time label live. Thanks in advance. It's probably a really simple fix.

Museer Ahamad Ansari
  • 5,414
  • 3
  • 39
  • 45
J.Kearney
  • 7
  • 1
  • 7

2 Answers2

3

Use Timer for your requirement,

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

    var timer = Timer()

    override func viewDidLoad() {
        super.viewDidLoad()
        getCurrentTime()
    }

    private func getCurrentTime() {
        timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector:#selector(self.currentTime) , userInfo: nil, repeats: true)
    }

    @objc func currentTime() {
        let formatter = DateFormatter()
        formatter.dateFormat = "hh:mm"
        currentTimeLabel.text = formatter.string(from: Date())
    }
}
Bappaditya
  • 9,494
  • 3
  • 20
  • 29
2

You can create Timer with repeating every minute (because you don't need seconds for anything) starting in the next minute (so call getCurrentTime() once before you start Timer).

Every minute code inside timer's closure gets executed so you can say that you want to call getCurrentTime(). Now your currentTimeLabel will be updated every minute

let now = Date()
let date = Calendar.current.date(bySettingHour: Calendar.current.component(.hour, from: now), minute: Calendar.current.component(.minute, from: now) + 1, second: 0, of: now)!
let timer = Timer(fire: date, timeInterval: 60, repeats: true) { _ in
    self.getCurrentTime()
}

Also I would recommend you to have formatter variable outside of the method (in global scope)

lazy var formatter: DateFormatter = {
    let formatter = DateFormatter()
    formatter.dateFormat = "hh:mm" // or "hh:mm a" if you need to have am or pm symbols
    return formatter
}()

and then in getCurrentTime() just get String and change text of currentTimeLabel

func getCurrentTime() {
    currentTimeLabel.text = formatter.string(from: Date())
}
Robert Dresler
  • 10,580
  • 2
  • 22
  • 40