前提・実現したいこと
初めて質問するため伝わりにくいところがあるかもしれませんがご容赦下さい...
現在「たった2日でマスターできる iPhoneアプリ開発講座」のタイマーアプリ作成しております。
太字で表記されているdisplayUpdateメソッドがどういった順序、タイミングで呼び出されるかがいまいち理解できません。
私の中ではdisplayUpdateメソッドがなぜ毎秒呼び出され、残り時間をラベルに表示できるのか他の動作と関連性を
見出せない状態です...
また、scheduledTimerメソッドが1秒毎に実行される度に、timerInterruptメソッドが呼び出されるといった解釈で正しいのでしょうか?
該当のソースコード
swift
1import UIKit 2 3class ViewController: UIViewController { 4 5 var timer: Timer! 6 7 var count = 0 8 9 let settingKey = "timer_value" 10 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 // Do any additional setup after loading the view. 14 15 let settings = UserDefaults.standard 16 17 settings.register(defaults: [settingKey: 10]) 18 19 } 20 21 22 @IBOutlet weak var countDownLabel: UILabel! 23 24 @IBAction func settingButtonAction(_ sender: Any) { 25 26 if let nowTimer = timer { 27 28 if nowTimer.isValid == true { 29 30 nowTimer.invalidate() 31 } 32 } 33 34 performSegue(withIdentifier: "goSetting", sender: nil) 35 } 36 37 38 39 @IBAction func startButtonAction(_ sender: Any) { 40 41 if let nowTimer = timer { 42 43 if nowTimer.isValid == true { 44 45 return 46 47 } 48 } 49 50 timer = Timer.**scheduledTimer**(timeInterval: 1.0, target: self, selector: #selector(self.timerInterrupt(_:)), userInfo: nil, repeats: true) 51 52 } 53 54 55 @IBAction func stopButtonAction(_ sender: Any) { 56 57 if let nowTimer = timer { 58 59 if nowTimer.isValid == true { 60 61 nowTimer.invalidate() 62 } 63 } 64 } 65 66 67 68 func **displayUpdate()** -> Int { 69 70 let settings = UserDefaults.standard 71 72 let timerValue = settings.integer(forKey: settingKey) 73 74 let remainCount = timerValue - count 75 76 countDownLabel.text = "残り(remainCount)秒" 77 78 return remainCount 79 80 } 81 82 83 @objc func **timerInterrupt**(_ timer: Timer) { 84 85 count += 1 86 87 if displayUpdate() <= 0 { 88 89 count = 0 90 91 timer.invalidate() 92 93 let alertController = UIAlertController(title: "終了", message: "タイマー終了時間です", preferredStyle: .alert) 94 95 let defaultAction = UIAlertAction(title: "OK", style: .default, handler: nil) 96 97 alertController.addAction(defaultAction) 98 99 present(alertController, animated: true, completion: nil) 100 101 } 102 } 103 override func viewDidAppear(_ animated: Bool) { 104 105 count = 0 106 107 _ = displayUpdate() 108 } 109 110 }
このままではソースコードが見にくいので、引用したいソースコードの前後を
```swift
(ソースコード)
```
と囲ってもらえますでしょうか。
他の質問者さんと同じく、読みやすいソースコードの形で表示できますし、コメントも付けやすくなります。
https://teratail.com/help#about-markdown
たとえば、処理の流れをわかりやすくする方法として、関数が呼ばれた後に
print(#function)
を実行することで、どのような順番で関数が呼ばれるのかをデバッグスクリーンで確認することもできます。
たとえば、
override func viewDidAppear(_ animated: Bool) {
print(#function)
count = 0
_ = displayUpdate()
}
のような感じです。
まずはこのような感じでいろんな関数(メソッド)にprint()を加えて、処理順番を表示させてみるのもいいと思います。
回答1件
あなたの回答
tips
プレビュー