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

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

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

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

Xcode

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

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

292閲覧

タイマーアプリの作成

SKMT

総合スコア57

iOS

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

Xcode

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

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2017/12/21 16:42

編集2017/12/21 18:04

###前提・実現したいこと
スタート、ストップ、リセットのあるストップウォッチを作りたいのです
ストップのあとスタートを押した際に、続きから計測できるようにしたいです

###発生している問題・エラーメッセージ
startTimerの中のstartTimeに何を入れたらいいのか分かりません

###該当のソースコード

swift4

1weak var timer: Timer! 2 var startTime = Date() 3 var tmp = ["00","00","00"] 4 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 8 } 9 10 @IBAction func startTimer(sender : AnyObject) { 11 if timer != nil{ 12 // timerが起動中なら一旦破棄する 13 timer.invalidate() 14 } 15 16 timer = Timer.scheduledTimer( 17 timeInterval: 0.01, 18 target: self, 19 selector: #selector(self.timerCounter), 20 userInfo: nil, 21 repeats: true) 22 23 timerMinute.text = tmp[0] 24 timerSecond.text = tmp[1] 25 timerMSec.text = tmp[2] 26 27 } 28 29 @IBAction func stopTimer(sender : AnyObject) { 30 if timer != nil{ 31 timer.invalidate() 32 } 33 34 tmp[0] = timerMinute.text! 35 tmp[1] = timerSecond.text! 36 tmp[2] = timerMSec.text! 37 } 38 39 @IBAction func resetTimer(_ sender: Any) { 40 timerMinute.text = "00" 41 timerSecond.text = "00" 42 timerMSec.text = "00" 43 44 tmp[0] = timerMinute.text! 45 tmp[1] = timerSecond.text! 46 tmp[2] = timerMSec.text! 47 } 48 49 50 @objc func timerCounter() { 51 // タイマー開始からのインターバル時間 52 let currentTime = Date().timeIntervalSince(startTime) 53 54 // fmod() 余りを計算 55 let minute = (Int)(fmod((currentTime/60), 60)) 56 // currentTime/60 の余り 57 let second = (Int)(fmod(currentTime, 60)) 58 // floor 切り捨て、小数点以下を取り出して *100 59 let msec = (Int)((currentTime - floor(currentTime))*100) 60 61 // %02d: 2桁表示、0で埋める 62 let sMinute = String(format:"%02d", minute) 63 let sSecond = String(format:"%02d", second) 64 let sMsec = String(format:"%02d", msec) 65 66 timerMinute.text = sMinute 67 timerSecond.text = sSecond 68 timerMSec.text = sMsec 69 70 } 71 72 override func viewWillDisappear(_ animated: Bool) { 73 super.viewWillDisappear(true) 74 timer.invalidate() 75 }

###試したこと
swift タイマーでネットで調べたり、持ってる参考書を読んでみたりしました

###補足情報(言語/FW/ツール等のバージョンなど)
swiftでのタイマーの作り方に関するサイトでいいのがあれば教えて欲しいです
アラーム音の出し方がわかると嬉しいです

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

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

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

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

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

guest

回答1

0

ベストアンサー

ソースコードの中身は理解されていますか?(どこかで見たことのあるようなソースコードのため)

結論から申しますと startTimer の中の startTime に何を入れても続きからの測定できるようにはできません.このソースコードは,startTime と現在時刻の差を表示しているだけです.

  • startTimer で startTime を現在時刻にする → それまでの計測はなくなる
  • startTimer で startTime をセットしない → そもそも計測スタートできない

なので,それまでの計測時間の累計を覚えておく変数を用意し,累計に startTime と現在時刻の差を合わせたものを表示する必要があります.

weak var timer: Timer! var startTime = Date() var totalTime = 0.0 @IBAction func startTImer(_ sender: Any) { if timer != nil { timer.invalidate() } else { startTime = Date(); } timer = Timer.scheduledTimer( timeInterval: 0.01, target: self, selector: #selector(self.timerCounter), userInfo: nil, repeats: true) } @IBAction func stopTimer(_ sender: Any) { if timer != nil { totalTime += Date().timeIntervalSince(startTime) timer.invalidate() timer = nil } displayTime(totalTime) } @IBAction func resetTimer(_ sender: Any) { startTime = Date(); totalTime = 0.0 displayTime(totalTime) } @objc func timerCounter() { let currentTime = totalTime + Date().timeIntervalSince(startTime) displayTime(currentTime) } func displayTime(_ time: TimeInterval) { let minute = (Int)(fmod((time/60), 60)) let second = (Int)(fmod(time, 60)) let msec = (Int)((time - floor(time))*100) timerMinute.text = String(format:"%02d", minute) timerSecond.text = String(format:"%02d", second) timerMSec.text = String(format:"%02d", msec) }

投稿2017/12/22 07:22

編集2017/12/23 15:01
togino77

総合スコア143

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

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

SKMT

2017/12/22 19:00

回答ありがとうございます。ソースコードはちゃんとは理解できていないです、、、 何処かのサイトのものを組み合わせて理解しながら作ろうとしてました 分かりました。ありがとうございます できれば分かりやすく書いてあるサイトなど教えてもらえると助かります
SKMT

2017/12/23 13:39

TimeInterval totalTime = 0 ってのはどんな意味があるんですか?普通にvarで宣言していいんですか?int型かString型か教えて欲しいです。
togino77

2017/12/23 14:07

すみません.普段 Objective-C で書いているので Swift の変数宣言ではなかったです. var totalTime = 0.0 で大丈夫です ただ,Date().timeIntervalSince(startTime) は,現在時刻との差を求めるメソッドですが,返ってきた値は TimeInterval 型であり,これは Double 型の別名です.ですので totalTime を0にリセットする時は Int 型の 0 ではなく Double型の 0.0 にしましょう. TimeInterval が何かと思ったら,普通に検索すると https://developer.apple.com/documentation/foundation/timeinterval 公式ドキュメントで見つかりますよ.
SKMT

2017/12/23 14:25

Objective-C使われてるんですね。なのにswift教えてくれてありがとうございます。分かりました。公式のやつ英語だから読むの大変なんですよね、、
SKMT

2017/12/23 15:26

コードの書き直しありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問