前提・実現したいこと
初心者です。
・最初の画面(ViewController)でpickerを使用して時間を選択してもらう
・開始のボタンを押して画面遷移をさせる
・遷移先(NextViewController)で「00:00:00」のようにlabelに時間を表示させ、カウントダウンを進める
上記のようなアプリを作ろうと思っています。
エラーは出ていないのですが、画面遷移ができず、開始ボタンを押すとそのまま固まってしまいます。
画面遷移のやり方を教えていただきたいです。
また、値の渡し方がこれで合っているのかもわかりません。そのことに関してもアドバイスが欲しいです。
初心者で何もわからず、根本的なところが間違っているかもしれないのですが、それがどこだかわからないです。どなたか分かる方いらっしゃいましたら、よろしくお願いします。
該当のソースコード
ViewController.swift
1import UIKit 2 3 4class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource{ 5 6 @IBOutlet weak var start: UIButton! 7 @IBOutlet weak var time: UIPickerView! 8 9 let data = [[Int](arrayLiteral: 15,30,45,60,90,120)] 10 11 var pickerdata:String! 12 var timeTotal:Int! 13 14 15 16 @IBAction func start(_ sender: Any) { 17 18 let storyboard: UIStoryboard = self.storyboard! 19 let timer = storyboard.instantiateViewController(withIdentifier: "toNextViewController") as! NextViewController 20 21 timer.getTime = timeTotal 22 23 self.present(timer, animated: true, completion: nil) 24 25 total() 26 27 self.performSegue(withIdentifier: "toNextViewController", sender: nil) 28 29 } 30 31 32 override func viewDidLoad() { 33 super.viewDidLoad() 34 // Do any additional setup after loading the view. 35 36 time.dataSource = self 37 time.delegate = self 38 } 39 40 41 42 43 func numberOfComponents(in pickerView: UIPickerView) -> Int { 44 return data.count 45 } 46 47 func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 48 return data[component].count 49 } 50 51 52 func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 53 return String(data[component][row]) 54 } 55 56 func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 57 total() 58 } 59 60 // pickerの数字をたすメソッド 61 func total() { 62 timeTotal = data[0][time.selectedRow(inComponent: 0)] * 60 63 } 64 65} 66
NextViewController.swift
1import UIKit 2 3class NextViewController: UIViewController { 4 5 var timer = Timer() 6 var count = 0 7 var getTime:Int! 8 9 @IBOutlet weak var timerLabel: UILabel! 10 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 runTimer() 14 timer.invalidate() 15 count = 0 16 timerLabel.text = timeString(time: TimeInterval(getTime)) 17 } 18 19 20 // カウントダウンをする関数 21 @objc func updateTimer() -> Int { 22 23 count += 1 24 //時間 = pickerで設定する時間 ー count 25 let remainCount = getTime! - count 26 timerLabel.text = timeString(time: TimeInterval(remainCount)) 27 28 // timerLabel.text = "(remainCount)" 29 30 // 0秒になったら止まる 31 if remainCount == 0 { 32 timer.invalidate() 33 timerLabel.text = "00:00:00" 34 } 35 return remainCount 36 37 } 38 39 //タイマーを動かす関数 40 func runTimer() { 41 timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(self.updateTimer), userInfo: nil, repeats: true) 42 } 43 44 //00:00:00に変える処理 45 func timeString(time: TimeInterval) -> String { 46 let hour = Int(time) / 3600 47 let minutes = Int(time) / 60 % 60 48 let second = Int(time) % 60 49 50 return String(format: "%02d:%02d:%02d", hour, minutes, second) 51 } 52 53 54 override func viewDidAppear(_ animated: Bool) { 55 56 timerLabel.text = timeString(time: TimeInterval(getTime)) 57 print(getTime ?? "this is nil") 58 59 } 60 61} 62
試したこと
segueに問題があるのかと思い、開始ボタンからsegueをつけたり、ViewControllerからsegueをつけたりしているのですができませんでした。現在はViewControllerから関連づけています。
補足情報(FW/ツールのバージョンなど)
Swift5でコーディングしています。
こちらのサイトを参考にして作成しました。
https://qiita.com/katsualonso14/items/bf64e2201e8fc73125e0
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/17 12:59
2020/06/17 20:50
2020/06/18 14:01