Отображение метки реального времени в Swift 4? - PullRequest
0 голосов
/ 23 декабря 2018

Моя метка времени отображает время, когда я открываю свое приложение, но оно не обновляет его в реальном времени.Я взглянул на другие ответы, но они не имели смысла.

// 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
    }

Я хочу, чтобы мое приложение обновляло метку времени в реальном времени.Заранее спасибо.Вероятно, это действительно простое исправление.

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Используйте Timer для вашего требования,

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())
    }
}
0 голосов
/ 23 декабря 2018

Вы можете создать Timer с повторением каждую минуту (потому что вам ни для чего не нужны секунды), начиная со следующей минуты (поэтому перед началом Timer вызовите getCurrentTime() один раз).

Каждый минутный код в закрытии timer выполняется, поэтому вы можете сказать, что хотите вызвать getCurrentTime().Теперь ваша currentTimeLabel будет обновляться каждую минуту

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()
}

Также я бы порекомендовал вам иметь переменную formatter вне метода (в глобальной области видимости)

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
}()

а затем в getCurrentTime() просто получите String и измените text из currentTimeLabel

func getCurrentTime() {
    currentTimeLabel.text = formatter.string(from: Date())
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...