質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Q&A

解決済

1回答

505閲覧

Swift でタイマーの表示を変えたい。

ryu_0915

総合スコア1

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

0グッド

0クリップ

投稿2021/07/25 07:36

編集2021/07/25 09:06

`初めまして。初心者の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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/07/25 08:58

コードは ``` // コードはこの中に書く ``` と書いた方が良いですよ これだと読む方が大変で回答が得られなくなります 簡単に読んだ限りだと @objc func displayUpdate() -> Int { ... }内でDataFormatterに置き換えるのが無難な気します
ryu_0915

2021/07/25 09:07

コードの中に書くこと出来ました。 ありがとうございます。 やってみます。
ryu_0915

2021/07/25 09:50

``` @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' というエラーが出ます。
退会済みユーザー

退会済みユーザー

2021/07/25 15:41

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 } で無理矢理は出来ます。
退会済みユーザー

退会済みユーザー

2021/07/25 15:46

気になった点をいくつか共有します。 ⚫︎labelのOutlet(接続コード)の位置はclass ViewController: UIViewController {の直下に書いた方が良いです ⚫︎let ramenPath = .. と var ramenPlayer = ..はsuper.viewDidLoad()内に移動した方が良いかも ⚫︎無駄な改行は読みづらいので一行までにしましょう ⚫︎コメントアウトしたコードは不要であれば削除しましょう
ryu_0915

2021/07/25 20:36

ありがとうございます! 他にもいろいろアドバイスいただき、 本当にありがとうございます。 さっそくやってみます!
guest

回答1

0

ベストアンサー

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) // 180 let formatter = DateFormatter() formatter.dateFormat = "mm:ss.SS" // フォーマットされた文字列に変換するプログラム。 let timeInterval = remainCount let targetDate = Date(timeIntervalSinceReferenceDate: TimeInterval(timeInterval)) let str = formatter.string(from: targetDate) //3:00 countDowmLabel.text = "(str)" return remainCount }

で無理矢理は出来ます。

気になった点をいくつか共有します。
⚫︎labelのOutlet(接続コード)の位置はclass ViewController: UIViewController {の直下に書いた方が良いです
⚫︎let ramenPath = .. と var ramenPlayer = ..はsuper.viewDidLoad()内に移動した方が良いかも
⚫︎無駄な改行は読みづらいので一行までにしましょう
⚫︎コメントアウトしたコードは不要であれば削除しましょう

投稿2021/07/26 04:21

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryu_0915

2021/07/27 02:01

ありがとうございます! 無事、出来ました。 それ以外にもいろいろな 助言本当に助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問