`初めまして。初心者のryu0915と申します。
現在、3分のタイマーアプリを作ってまして、
表示を180という表示から03:00という表示に変えたいのですが、
どのように変えていいかわかりません。
DataFormatterを使うところまでは調べたのですが、
調べて導入しても、エラーになってしまいます。
どこにどのように導入すれば良いか
申し訳ありませんが皆様の力を貸してください。
よろしくお願いします。
swift
1import UIKit 2import AVFoundation 3 4class ViewController: UIViewController { 5 6 //タイマーの変数作成する 7 var timer : Timer? 8 9 //カウント(経過時間)の変数を作成 10 var count = 0 11 12 //設定値を扱うキーを設定 13 let settingkey = "timer_value" 14 15 16 override func viewDidLoad() { 17 super.viewDidLoad() 18 // Do any additional setup after loading the view. 19 20 //userDefaultsのインスタンスを生成 21 let settings = UserDefaults.standard 22 23 //usedefaultsに初期値に登録 24 settings.register(defaults: [settingkey:60*3]) 25 26 27 } 28 29 30 31 @IBOutlet weak var countDowmLabel: UILabel! 32 33 let ramenPath = Bundle.main.bundleURL.appendingPathComponent("ramensound1.mp3") 34 var ramenPlayer = AVAudioPlayer() 35 36 37 @IBAction func startButtonAction(_ sender: Any) { 38 do{ 39 ramenPlayer = try AVAudioPlayer(contentsOf: ramenPath) 40 ramenPlayer.play() 41 }catch{ 42 print("startでエラー") 43 } 44 if let nowTimer = timer { 45 if nowTimer.isValid == true { 46 return 47 } 48 } 49 50 timer = Timer.scheduledTimer(timeInterval: 1.0, 51 target: self, 52 selector: #selector(self.timerInterupt(_:)), 53 userInfo: nil, 54 repeats: true) 55 56 } 57 58 59 @IBAction func canselButtonAction(_ sender: Any) { 60 do{ 61 ramenPlayer = try AVAudioPlayer(contentsOf: ramenPath) 62 ramenPlayer.play() 63 }catch{ 64 print("canselでエラー") 65 } 66 /*if let nowTimer = timer { 67 if nowTimer.isValid == true { 68 return 69 } 70 }*/ 71 if let nowTimer = timer{ 72 if nowTimer.isValid == true{ 73 count = 0 74 _ = displayUpdate() 75 nowTimer.invalidate() 76 77 } 78 } 79 } 80 //画面を更新する(戻り値:remainCount:残り時間) 81 @objc func displayUpdate() -> Int { 82 let settings = UserDefaults.standard 83 let timeValue = settings.integer(forKey: settingkey) 84 let remainCount = timeValue - count 85 86 87 countDowmLabel.text = "(remainCount)" 88 89 90 91 92 93 94 95 96 97 return remainCount 98 } 99 100 101 @objc func timerInterupt (_ timer:Timer){ 102 103 count += 1 104 105 106 107 if displayUpdate() <= 0 { 108 count = 0 109 timer.invalidate() 110 performSegue(withIdentifier: "goSetting", sender: nil) 111 112 } 113 114 } 115 116 override func viewDidDisappear(_ animated: Bool) { 117 count = 0 118 _ = displayUpdate() 119 } 120 121}
コードは
```
// コードはこの中に書く
```
と書いた方が良いですよ
これだと読む方が大変で回答が得られなくなります
簡単に読んだ限りだと @objc func displayUpdate() -> Int { ... }内でDataFormatterに置き換えるのが無難な気します
コードの中に書くこと出来ました。
ありがとうございます。
やってみます。
```
@objc func displayUpdate() -> Int {
let settings = UserDefaults.standard
let timeValue = settings.integer(forKey: settingkey)
let remainCount = timeValue - count
let formatter = DateFormatter()
formatter.dateFormat = "mm:ss.sss"
countDowmLabel.text = formatter.Date(from:remainCount)
//countDowmLabel.text = "\(remainCount)"
return remainCount
}
```
にすると、Value of type 'DateFormatter' has no member 'Date'
というエラーが出ます。
labelにはStringしか渡せないので"\(表示したい何か)"でキャストしないとダメです
"\(remainCount)" に 180が入っていると想定して..
@objc func displayUpdate() -> Int {
let settings = UserDefaults.standard
let timeValue = settings.integer(forKey: settingkey)
let remainCount = timeValue - count
print("remainCountは・・")
print(remainCount)
let formatter = DateFormatter()
formatter.dateFormat = "mm:ss.SS"
// フォーマットされた文字列に変換するプログラム。
let timeInterval = remainCount
let targetDate = Date(timeIntervalSinceReferenceDate: TimeInterval(timeInterval))
let str = formatter.string(from: targetDate)
countDowmLabel.text = "\(str)"
return remainCount
}
で無理矢理は出来ます。
気になった点をいくつか共有します。
⚫︎labelのOutlet(接続コード)の位置はclass ViewController: UIViewController {の直下に書いた方が良いです
⚫︎let ramenPath = .. と var ramenPlayer = ..はsuper.viewDidLoad()内に移動した方が良いかも
⚫︎無駄な改行は読みづらいので一行までにしましょう
⚫︎コメントアウトしたコードは不要であれば削除しましょう
ありがとうございます!
他にもいろいろアドバイスいただき、
本当にありがとうございます。
さっそくやってみます!
回答1件
あなたの回答
tips
プレビュー