Syn c несколько временных меток со временем хоста - PullRequest
0 голосов
/ 19 апреля 2020

Какой был бы возможный способ обновить метки, которые отображают время c времени, полученное один раз от API. У меня есть tableView, где каждый cell отображает название города, текущую температуру и время так же, как и родное iPhone WeatherApp .Есть ли способ наблюдать минуты часов устройства, чтобы я мог вызвать какой-то код для обновления времени, когда проходит минута?

1 Ответ

1 голос
/ 19 апреля 2020

Вы можете создать подкласс UILabel и добавить к нему таймер, чтобы он автоматически обновлялся:

Учитывая ваш последний вопрос, где вы получаете смещение timeZone от GMT из вашего API, вы можете создать подкласс UILabel, добавить свойство timeZone и замыкание didSet для установки таймера на следующую четную минуту с интервалом в 60 секунд и его повторения. Добавьте селектор, чтобы обновлять свою метку каждый раз, когда вызывается этот метод:

class Clock: UILabel {
    let dateFormatter = DateFormatter()
    var timer = Timer()
    var timeZone: Int = 0 {
        didSet {
            dateFormatter.timeStyle = .short
            dateFormatter.timeZone = TimeZone(secondsFromGMT: timeZone)
            var components = Date().components
            components.minute! += 1
            components.second = 0
            components.nanosecond = 0
            timer = .init(fireAt: components.date!, interval: 60, target: self, selector: #selector(update), userInfo: nil, repeats: true)
            RunLoop.main.add(timer, forMode: .common)
            update()
        }
    }
    @objc func update(_ timer: Timer? = nil) {
        text = dateFormatter.string(from: Date())
    }
}

extension Date {
    var components: DateComponents {
        Calendar.current.dateComponents(in: .current, from: self)
    }
}

Теперь вы можете просто создать метку часов и при настройке ее свойства timeZone она запустится работает автоматически:

let clock: Clock = .init(frame: .init(origin: .zero,
                                        size: .init(width: 200, height: 30)))
clock.timeZone = -14400

clock.text  // "11:01 PM"
...