2画面での時間、分、秒を設定できるタイマーを作りたい
2画面を遷移する、時間、分、秒を設定できるタイマーの作成に取り組んでいます。
タイマー 画面と設定画面があり設定画面でpicker view3列で時間、分、秒を選択できるようにしています。
一度設定してタイマー 画面に行きもう一度設定画面に戻った時に以前のpicker viewの値を再読み込みできておらず動かさないpicker viewの値が全て0になってしまいます。画面遷移時にpicke viewの値を読むか他の方法で表示と設定が一致するようにしたいです。
### swift import UIKit class SettingViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate { @IBOutlet weak var label1: UILabel! @IBOutlet weak var label2: UILabel! @IBOutlet weak var label3: UILabel! @IBOutlet weak var timerSettingPicker: UIPickerView! @IBAction func decisionButtonAcition(_ sender: Any) { _ = navigationController?.popViewController(animated: false) } let list1: [Int] = [Int](0...2) let list2: [Int] = [Int](0...60) let list3: [Int] = [Int](0...60) let settingKey = "timer_value" override func viewDidLoad() { super.viewDidLoad() timerSettingPicker.delegate = self timerSettingPicker.dataSource = self timerSettingPicker.selectRow(0, inComponent: 0, animated: true) timerSettingPicker.selectRow(1, inComponent: 1, animated: true) timerSettingPicker.selectRow(2, inComponent: 2, animated: true) let settings = UserDefaults.standard _ = settings.integer(forKey: settingKey) // Do any additional setup after loading the view. } /* // MARK: - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // Get the new view controller using segue.destination. // Pass the selected object to the new view controller. } */ func numberOfComponents(in pickerView: UIPickerView) -> Int { return 3 } func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { switch component { case 0: return list1.count case 1: return list2.count case 2: return list3.count default: return 0 } } func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { switch component { case 0: return String(list1[row]) case 1: return String(list2[row]) case 2: return String(list3[row]) default: return "error" } } var subTotal : [Int] = [0, 0, 0] func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { switch component { case 0: label1.text = String(list1[row]) + " 時間" subTotal[0...0] = [list1[row]] case 1: label2.text = String(list2[row]) + " 分" subTotal[1...1] = [list2[row]] case 2: label3.text = String(list3[row]) + " 秒" subTotal[2...2] = [list2[row]] default: return } print(subTotal) let aTotal: Int = subTotal[0] * 60 * 60 let bTotal: Int = subTotal[1] * 60 let cTotal: Int = subTotal[2] let timerValue = aTotal + bTotal + cTotal print(timerValue) let settings = UserDefaults.standard settings.set(timerValue, forKey: settingKey) settings.synchronize() } } ----------------------------------------------------- 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. let settings = UserDefaults.standard settings.register(defaults: [settingKey:20]) print(settingKey) } @IBOutlet weak var countDownLabel: UILabel! @IBAction func settingButtonAction(_ sender: Any) { if let nowTimer = timer { if nowTimer.isValid == true { nowTimer.invalidate() } } 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) { if let nowTimer = timer { if nowTimer.isValid == true { nowTimer.invalidate() } } } func displayUpdate() -> Int { let settings = UserDefaults.standard let timerValue = settings.integer(forKey: settingKey) let remainCount = timerValue - count let hour = remainCount / 3600 let mHour = remainCount % 3600 let minutes = mHour / 60 let sMinutes = mHour % 60 let second = sMinutes % 60 print(hour,minutes, second) countDownLabel.text = "残り (hour) 時間 (minutes) 分 (second) 秒" return remainCount } @objc func timerInterrupt(_ timer: Timer) { count += 1 if displayUpdate() <= 0 { count = 0 timer.invalidate() } } override func viewDidAppear(_ animated: Bool) { count = 0 _ = displayUpdate() } }
swift
### user default で読み込んでいるように思うのですが プリントデバッグでも反映されていないので間違っているのは分かるのですが、自分のレベルでは到底解決できませんでした。なんとかネットを検索し3列のタイマー設定するまではたどり着けました。おそらく上級者の人が見ればかなり下手くそなコードだと思います。どなたかぜひご教示いただければと思います。拙い質問分ですがどうかよろしくお願いします。 ### x code 10.2.1 swift5.0.1 macOs Mojave 10.14.5
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/19 17:18
2020/03/20 23:30