【Swift】00:00:00表示 pickerを用いたカウントダウンタイマーの実装


【はじめに】 

ラベルに00:00:00と表示するカウントダウンタイマーで、pickerを用いた実装方法をまとめてみました。
参考になれば幸いです。

【目次】

・デザイン

・picker画面詳細
・timer画面詳細
・参考サイト
・最後に

【デザイン】


【合計する関数】


func total() {
        timeTotal = timeList[0][timePicker.selectedRow(inComponent: 0)] * 60 * 60 + timeList[0][timePicker.selectedRow(inComponent: 1)] * 60 + timeList[0][timePicker.selectedRow(inComponent: 2)]

pickerのそれぞれの列で選ばれた値[timePicker.selectedRow(inComponent: 0or1or2)]を合計する(秒に換算する)メソットです。
時間は * 60 * 60
分は * 60
と秒に置き換えて合計する。


timer.getTime = timeTotal

合計した値を遷移先に渡す

【timer画面詳細】

@IBAction func StartButton(_ sender: Any) {
     //タイマーが有効なら 何もしない
     if timer.isValid == true {
                return
            }

             runTimer()
    }

 スタートボタンを押したあとでもう一度押すと-2秒や-4秒となるのを防ぐため
タイマーが有効の時はボタンを押しても何も起こらないようにする。

runTimer() ではじめて押した時はタイマー起動


@objc func updateTimer() -> Int {

        count += 1
        //時間 = pickerで設定する時間 ー count
        let remainCount = getTime! - count
        timerLabel.text = timeString(time: TimeInterval(remainCount))

受け取った値(getTime)から1秒ごとに増えるcountを引いてカウントダウンを行う。

受け取った値のまま表示させると2分だと120と秒数が表示される。
その値を00:00:00表式でラベルに表示できるように変更する。

 func timeString(time: TimeInterval) -> String {
          let hour = Int(time) / 3600
          let minutes = Int(time) / 60 % 60
          let second = Int(time) % 60

          return String(format: "%02d:%02d:%02d", hour, minutes, second)
      }

00:00:00表式でラベルに表示するメソット

TimeIntervalはapple公式サイトによると
「値は常に秒単位で指定します。10,000年の範囲でサブミリ秒の精度を実現します。」とのこと。

時間はTimeIntervalを 3600を割る
分はTimeIntervalを  60で割り60で割った余り
秒はTimeIntervalを  60で割った余り
となる。

【参考サイト】

【Swift】コードを使った二つの画面遷移の方法
【swift5】カウントダウンタイマーの実装

【最後に】

もっと詳細が知りたい方や指摘して頂ける方などお気軽にコメントください。
たくさんのフィードバックを頂けると幸いです。