timerクラスのscheduledTimerを利用して、
タイマーを表示してカウントするアプリを実装中なのですが、
scheduledTimerのtimeInterval: を1.0と設定しており、
self.timerInterrupt(_:)で時間の経過を処理しています。
ここまでは理解できるのですが、1.0秒ごとにtimerInterruptを呼んで処理しているので、
カウントは増えていくのはわかるのですが、画面に表示されるカウントまで1.0秒ごとに、
更新できてしまう理由がわかりません。
1.0秒ごとにここで実装している、displayUpdate()を呼ぶのなら
理解できるのですが。よろしくお願いします。
import UIKit class ViewController: UIViewController { //タイマーの変数を作成 var timer: Timer? //カウント(経過時間)の変数を作成 var count = 0 //設定値を扱うキーを作成 let settingKey = "timer_Value" override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. //UserDefaultsのインスタンスを生成 let settings = UserDefaults.standard //UserDefaultsに初期値を登録 settings.register(defaults: [settingKey:10]) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } @IBOutlet weak var countDownLabel: UILabel! //画面遷移を設定 @IBAction func settingButtonAction(_ sender: Any) { stopTimer() //画面遷移実行 performSegue(withIdentifier: "goSetting", sender: nil) } @IBAction func startButtonAction(_ sender: Any) { //カウントダウン処理の実装 //タイマーが実行中かチェックする if let nowTimer = timer { //もしタイマーが実行中ならスタートしない if nowTimer.isValid == true { //なにもしない return } } //タイマーをスタート timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(self.timerInterrupt(_:)), userInfo: nil, repeats: true) } //タイマー停止処理 @IBAction func stopButtonAction(_ sender: Any) { stopTimer() } //タイマー停止メソッド func stopTimer() { if let nowTimer = timer { if nowTimer.isValid == true { nowTimer.invalidate() } } } //画面を更新するメソッド func displayUpdate() -> Int { //UserDefaultsのインスタンスを生成 let settings = UserDefaults.standard //取得した秒数をtimerValueに渡す let timerValue = settings.integer(forKey: settingKey) //残り時間を計算 let remainCount = timerValue - count //残り時間をラベルに表示 countDownLabel.text = "残り(remainCount)秒" //残り時間を戻り値に設定 return remainCount } //経過時間を処理するメソッドの作成 @objc func timerInterrupt(_ timer:Timer) { count += 1 //残り時間が0以下の時実行→→→戻り値がremaiCountなので残り時間 if displayUpdate() <= 0 { count = 0 //タイマー停止 timer.invalidate() } } override func viewDidAppear(_ animated: Bool) { //カウントを0にする count = 0 //タイマー表示を更新する //使用しない変数を作成するとエラーがでるので「_」に代入するシステムを利用して回避する!! _ = displayUpdate() } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/28 03:01
2018/05/28 03:03 編集
2018/05/28 03:04