как обновить время по времени с устройства в строке состояния? - PullRequest
0 голосов
/ 22 октября 2018

, поэтому у меня есть метка, которая отображает время в формате ЧЧ: мм.и этот ярлык будет периодически обновляться каждую минуту.Я могу сделать это на самом деле, используя timer, как показано ниже:

class HomeVC: UIViewController {

    @IBOutlet var timeLabel: UILabel!

    private var timer = Timer()
    private var timeBase = Date()

    override func viewDidLoad() {
        super.viewDidLoad()

        setTime()

    }
}

extension HomeVC {

    //MARK: - Method related to time

    func setTime() {

        activateTimer()

        timeLabel.text = dateTimeService.convert(date: timeBase, toFormat: "HH:mm")
        dayLabel.text = dateTimeService.convert(date: timeBase, toFormat: "EEEE")
        dateLabel.text = dateTimeService.convert(date: timeBase, toFormat: "d MMMM yyyy")
    }

    func activateTimer() {
        timer = Timer.scheduledTimer(timeInterval: 60 , target: self, selector: #selector(HomeVC.updateTimer), userInfo: nil, repeats: true)
    }

    @objc func updateTimer() {
        // add one minute
        timeBase = dateTimeService.addMinuteTo(date: timeBase, minute: 1)

        // update label
        timeLabel.text = dateTimeService.convert(date: timeBase, toFormat: "HH:mm")
    }

}

, но оно не будет точно таким же, как время, отображаемое в строке состояния, у него будет разница в несколько секунд, как обновитьметка времени, которая всегда будет соответствовать времени, отображаемому в строке состояния?так что если время в строке состояния изменится, то метка также изменится точно так же

1 Ответ

0 голосов
/ 22 октября 2018

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

func activateTimer() {
    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)!
    timer = Timer(fireAt: date, interval: 60, target: self, selector: #selector(updateTimer), userInfo: nil, repeats: true)
    RunLoop.main.add(timer, forMode: .commonModes)
    // Swift 4.2
    //  RunLoop.main.add(timer, forMode: .common)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...