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

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

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

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

Swift

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

Q&A

解決済

1回答

704閲覧

ストップウォッチを再スタートさせるには

enohpi

総合スコア45

Xcode

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

Swift

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

0グッド

0クリップ

投稿2017/08/22 10:30

編集2017/08/25 04:10

###前提・実現したいこと
Xcode 8.3.2 、Swift初心者です。

http://mory.weblike.jp/wordpress/?p=64
https://teratail.com/questions/66101

上の2つ、他のサイトを参照にストップウォッチアプリを作ってみています。

現在、このコードだと「スタート」ボタン、「ストップ」ボタンを押した後に、もう一度「スタート」ボタンを押すと再び0秒からのスタートになってしまいます。

もう一度「スタート」ボタンを押したときに、iPhoneの時計アプリのように、「ストップ」ボタンを押したときのタイムからのカウントにしたいです。

###試したこと
http://d.hatena.jp/yamekodev/20120918/1347972548

上のサイトを参照してみましたが、今年Swiftデビューしたばかりなので、型の保持などがイマイチよくわかりませんでした。
もし、初心者の自分でもわかるように説明していただけたら幸いです。

###ソースコード

Swift

1 2import UIKit 3 4class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 5 6 @IBOutlet weak var timeLabel: UILabel! 7 @IBOutlet weak var startstopButton: UIButton! 8 @IBOutlet weak var resetButton: UIButton! 9 10 var startTime: TimeInterval? = nil 11 var timer: Timer? 12 13 override func viewDidLoad() { 14 super.viewDidLoad() 15 16 // Do any additional setup after loading the view. 17 setButtonEnabled(startstop: true, reset: false) 18 } 19 20 func update(){ 21 if let t = self.startTime { 22 let time:Double = NSDate.timeIntervalSinceReferenceDate - t 23 let sec: Int = Int(time) 24 let msec: Int = Int((time - Double(sec))*100.0) 25 if sec < 3600 { 26 if sec < 0 { 27 self.timeLabel.text = "00:00.0" 28 } else { 29 self.timeLabel.text = NSString(format: "%02d:%02d.%01d", sec/60, sec%60, msec/10) as String 30 } 31 } else { 32 self.timeLabel.text = NSString(format: "%02d:%02d:%02d.%01d", sec/3600, sec/60, sec%60, msec/10) as String 33 } 34 } 35 } 36 37 func setButtonEnabled(startstop: Bool, reset: Bool) { 38 self.startstopButton.isEnabled = startstop 39 self.resetButton.isEnabled = reset 40 } 41 42 var counter = 0 43 var amari = 0 44 45 @IBAction func startstopTimer(_ sender: UIButton) { 46 counter = counter + 1 47 amari = counter % 2 48 49 if amari > 0 { 50 setButtonEnabled(startstop: true, reset: false) 51 startstopButton.setTitle("ストップ", for: .normal) 52 self.startTime = NSDate.timeIntervalSinceReferenceDate 53 self.timer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(ViewController.update), userInfo: nil, repeats: true) 54 } else { 55 setButtonEnabled(startstop: true, reset: true) 56 startstopButton.setTitle("スタート", for: .normal) 57 self.timer?.invalidate() 58 self.timer = nil 59 } 60 } 61 62 @IBAction func resetTimer(_ sender: UIButton) { 63 setButtonEnabled(startstop: true, reset: false) 64 self.startTime = nil 65 self.timeLabel.text = "00:00.0" 66 } 67 68 override func didReceiveMemoryWarning() { 69 super.didReceiveMemoryWarning() 70 // Dispose of any resources that can be recreated. 71 } 72 73} 74

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

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

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

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

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

guest

回答1

0

ベストアンサー

インスタンス変数としてたとえば initialTimeみたいなものを用意しておいて(var initialTime:TimeInterval = 0)、それを使ってupdate関数のところで

let time:Double = initialTime + NSDate.timeIntervalSinceReferenceDate - t

とかしてあげれば良いのではないかと。

ストップしたときにinitialTimeに止めた時の時刻を入れてあげれば続きからカウントできるかと思います。リセットは単にinitialTimeを0にするだけですね。

投稿2017/08/24 05:32

YokemuraTakeshi

総合スコア297

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

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

enohpi

2017/08/24 12:15

ご返答ありがとうございます。 リセットの時の処理は self.initialTime = 0 で大丈夫でしょうか。 「ストップしたときにinitialTimeに止めた時の時刻を入れてあげれば」の部分について、どのようなコードにすれば良いでしょうか。 いまいち理解できていなくて申し訳ありません。 お手数おかけいたしますが、ご返答よろしくお願いいたします。
YokemuraTakeshi

2017/08/24 12:38

リセットは self.initialTime = 0 で大丈夫と思います。 停止時の時刻を控えておくのは } else { setButtonEnabled(startstop: true, reset: true) startstopButton.setTitle("スタート", for: .normal) self.timer?.invalidate() self.timer = nil let currentTime = NSDate.timeIntervalSinceReferenceDate self.initialTime = currentTime - self.startTime } ですかね。
enohpi

2017/08/24 14:00

ありがとうございます。 self.initialTime = currentTime - self.startTime! だと、2回目にスタートを押した時はうまくいきましたが、3回目以降にスタートを押した時に、 n回目にスタートを押した瞬間に表示される時刻 =「(n-1)回目にスタートを押した時間から(n-1)回目にストップを押した時間までの期間」 このような結果となりました。 よって、3回目以降も正しい値を出すためには、その直前までの全てのinitialTimeを合計する必要があると考えます。 しかし、どうすれば良いかわかりません。 何度も申し訳ありませんが、ご返答よろしくお願いいたします。
YokemuraTakeshi

2017/08/24 14:21

このように考えてみてください。 ・この機構を実現するには、次の2つの情報を保持しておく必要があります。 (1)スタートボタンを押した時のストップウォッチ上の時刻 (2)スタートボタンを押した時の実世界上での時刻 ・ストップウォッチが走行中の間に表示すべき値は、上記(1)に、同(2)からの経過時刻を足したものです。
enohpi

2017/08/25 04:05

self.initialTime = initialTime + currentTime - self.starttime! こちらでうまくいきました! initialTimeを用意する方法など、ものすごく参考になりました。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問