#前提・実現したいこと
タイマーアプリ(slider
でtimer
の値を取得しています)を作成しています。タイマーが完了(couter
が0)したら、アラートを表示できるようにしたい。タイマーの起動、リセットは問題なくできております。
発生している問題・エラーメッセージ
アラートが表示されない(成功のアラート)。
該当のソースコード
swift
1import UIKit 2 3class HomeVC: UIViewController { 4 5 var count:Int = 0 6 var timer:Timer! 7 var userTimer:String! 8 var alert:UIAlertController! 9 10 @IBOutlet weak var minutesLabel: UILabel! 11 @IBOutlet weak var secondLabel: UILabel! 12 @IBAction func currentSliderValue(_ sender: UISlider) { 13 14 let sliderValue:Int = Int(sender.value) 15 userTimer = String(sliderValue*1) 16 //5分間隔で表示させる 17 minutesLabel.text = userTimer 18 } 19 20 21 override func viewDidLoad() { 22 super.viewDidLoad() 23 24 25 26 } 27 28 override func viewDidAppear(_ animated: Bool) { 29 30 } 31 32 33 @IBAction func countDownBtn(_ sender: UIButton) { 34 count = Int(minutesLabel.text!)! * 60 35 36 if timer == nil { 37 timer = Timer.scheduledTimer(timeInterval: 1.0, target:self, selector: #selector(self.timerAction(sender:)), userInfo: nil, repeats: true) 38 sender.setTitle("ギブアップ", for: UIControl.State.normal) 39 40 }else { 41 // タイマーが動いているなら 42 if timer.isValid { 43 44 //ギブアップアラート発動 45 alert = UIAlertController(title: "ギブアップ", message: "本当に諦めますか", preferredStyle: .alert) 46 47 let giveUpAction = UIAlertAction(title: "諦める", style: .default) {action in 48 print("諦める") 49 //タイマーをリセット 50 self.minutesLabel.text = self.userTimer 51 self.secondLabel.text = "00" 52 sender.setTitle("スタート", for: UIControl.State.normal) 53 54 self.timer.invalidate() 55 56 } 57 58 let canselAction = UIAlertAction(title: "キャンセル", style: .default) {action in 59 print("キャンセル") 60 61 } 62 63 //Actionを追加 64 alert.addAction(giveUpAction) 65 alert.addAction(canselAction) 66 67 // UIAlertを発動 68 present(alert, animated: true, completion: nil) 69 } 70 //タイマーが動いていないなら 71 else{ 72 timer = Timer.scheduledTimer(timeInterval: 1.0, target:self, selector: #selector(self.timerAction(sender:)), userInfo: nil, repeats: true) 73 timer.fire() 74 75 76 } 77 78 } 79 80 81 82 } 83 //カウントダウン 84 @objc func timerAction(sender:Timer) { 85 86 if count > 0{ 87 count -= 1 88 print(count) 89 90 // %02d:分・秒を2桁表示 91 let sMinute = String(format:"%02d", count/60) 92 let sSecond = String(format:"%02d", count%60) 93 94 minutesLabel.text = sMinute 95 secondLabel.text = sSecond 96 } 97 //タイマーが終了したら 98 else if count == 0 { 99// sender.setTitle("スタート", for: UIControl.State.normal) 100 successAlert() 101 sender.invalidate() 102 103 104 } 105 } 106 107 //成功のアラート発動 108 func successAlert() { 109 alert = UIAlertController(title: "おつかれさま", message: "(userTimer!) + 円を手に入れました!", preferredStyle: .alert) 110 let okAction = UIAlertAction(title: "OK", style: .default) { (action:UIAlertAction) in 111 print("給与が支払われた") 112 } 113 alert.addAction(okAction) 114 115 // UIAlertを発動 116 present(alert, animated: true, completion: nil) 117 118 119// let moneyImage = UIImage(named: "money") 120// let imageView = UIImageView(frame: CGRect(x: 220, y: 10, width: 40, height: 40)) 121// imageView.image = moneyImage 122// alert.view.addSubview(imageView) 123 124 } 125 126 127 128 129}
補足情報
- swift5.0
- xcode11.1
回答1件
あなたの回答
tips
プレビュー