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

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

ただいまの
回答率

88.21%

swiftでストップウォッチアプリを作りました。そこに新しい機能を追加したいのですが、、

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 3,792

123daaa

score 75

swiftでストップウォッチアプリを作りました。
そのアプリに以下の機能を追加しようと思います。

一つの作業が完了するまでの時間(秒)を計測した上で、
その時間をもとに1時間あたりではいくつの作業が完了するのか、
計算して画面に表示させる機能。

(計算式:3600 / 計測した秒数 = 1時間あたりの作業数)

どのように書けば、上記のような機能を追加できるでしょうか?
現状のソースコードは以下のようになります。


import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var timerLabel: UILabel!
    @IBOutlet weak var startButton: UIButton!
    @IBOutlet weak var stopButton: UIButton!
    @IBOutlet weak var resetButton: UIButton!
    @IBOutlet weak var page: UILabel!
    
    var startTime: NSTimeInterval? = nil
    var timer: NSTimer?
    var elapsedTime: Double = 0.0
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setButtonEnabled(true, stop: false, reset: false)
        // Do any additional setup after loading the view, typically from a nib.
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    func setButtonEnabled(start:Bool, stop:Bool, reset:Bool) {
        self.startButton.enabled = start
        self.stopButton.enabled = stop
        self.resetButton.enabled = reset
    }
    
    func update() {
        if let t = self.startTime {
            let time: Double = NSDate.timeIntervalSinceReferenceDate() - t + self.elapsedTime
            let sec: Int = Int(time)
            let msec: Int = Int((time - Double(sec)) * 100.0)
            self.timerLabel.text = NSString(format: "%02d:%02d:%02d", sec/60, sec%60, msec) as String
        }
    }
    
    @IBAction func startTimer(sender: AnyObject) {
        setButtonEnabled(false, stop: true, reset: false)
        self.startTime = NSDate.timeIntervalSinceReferenceDate() // 2001/1/1 0:0:0
        self.timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: Selector("update"), userInfo: nil, repeats: true)
    }
    
    @IBAction func stopTimer(sender: AnyObject) {
        setButtonEnabled(true, stop: false, reset: true)
        if let t = self.startTime {
            self.elapsedTime += NSDate.timeIntervalSinceReferenceDate() - t
            self.timer?.invalidate()
            self.timer = nil
        }
    }
    
    @IBAction func resetTimer(sender: AnyObject) {
        setButtonEnabled(true, stop: false, reset: false)
        self.elapsedTime = 0.0
        self.startTime = nil
        self.timerLabel.text = "00:00:00"
    }
}







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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

@IBAction func stopTimer(sender: AnyObject)
でタイマーをストップさせるのであれば、そのメソッド内に1時間あたりで何回作業が行えるかの計算を行うという感じになるかと思います。
ストップボタンをタップした時に上記の計算結果をアラートで表示し、保存と終了などの選択肢を用意した上で
保存の場合はその作業のタイトルを入力して計算結果を一緒に保存
保存された結果は別の画面でタイトルと共にUITableViewなどで表示
等色々やり方はあるかと。(一応参考程度の方法です...)
UI/UXをしっかりデザインすれば、単純な処理でもしっかり形になると思います!

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/04/18 00:48

    ありがとうございます。初心者なので、教本などを真似ている段階ですが、少し自分のアイディアとして、カスタマイズを行っている段階です。
    @IBAction func stopTimer(sender: AnyObject)
    上記のメソッド内に入れるんですね。参考になります。

    別件ですが、不明なエラーが起きました。もしお判りでしたら、ご教授ください。

    上記のコードは教本の通りに真似ただけです。
    しかし、

    @IBOutlet weak var page: UILabel!

    この一行は自分で追加しました。
    UI部品(ラベル)とコードを接続したものです。

    これを追加して、
    func update() {
    上記のメソッドで実際に、新たな表示をしました。

    ここからが本題ですが、
    上記の作業中、突然、
    thread 1 signal sigabrt
    というエラーが出てきました。
    該当箇所は以下の部分です。

    class AppDelegate: UIResponder, UIApplicationDelegate {

    自分で調べたところ、UI部品とコードの接続において、
    なにかうまく繋がっていない(定義されていないところがある)
    というところまで辿りつけました。

    一体、原因は何なんでしょうか?

    キャンセル

0

Outletがしっかりされているかどうか確認するために、storyboardを開いて対象UILabelにフォーカスを当ててから右メニューのUtillitiesを開き、「Show the Connection inspector」を選択し、 Referencing Outletsが接続されているかを確認してください。
以下は参考画像です。
イメージ説明これは、UILabelがViewControllerのtestというUIlabelのインスタンス変数に接続されていることを指します。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/04/21 18:58

    ありがとうございます。

    ご指摘頂いた項目より接続を確認してみました。
    問題なかったです。

    何度も質問して申し訳ありません。

    いま、

    @IBOutlet weak var page: UILabel!

    上記のpageラベルをコードと接続したうえで、
    update()メソッドに次の一文を書きました。

    self.page.text = NSString(format: "%02d", sec) as String

    当然、この状態では、「page」のラベルに「秒数」が表示されます。

    今回、上記の「秒数」の部分に、代わりとして、
    「いくつの作業が完了するのか」という機能を表示させたいと思います。

    そこで上記のコードを以下のように変えてみました。

    let task: Int = 3600 / sec
    self.page.text = NSString(format: "%02d", task) as String

    すると以下のエラーが出ました。

    Thread 1: EXC_BAD_INSTRUCTION(code=EXC_1386_INVOP, subcode=0x0)

    前回とは異なるエラーです。。

    ご教授頂ければ幸いです。。

    キャンセル

  • 2015/04/21 23:06

    そのエラーが出たことないので詳細にはわかりませんが、調べてみると
    ・IBOutletの接続ミス
    ・releaseしてはいけないリソースをreleaseしてしまっている
    ・変数が初期化される前に、viewDidLoadでメソッドなどを呼び出している

    http://fqa.io/questions/28754997/exc-bad-instruction-code-exc-i386-invop-subcode-0x0
    http://stackoverflow.com/questions/24189738/diagnosing-exc-bad-instruction-in-swift-standard-library
    ここにも同じ様な内容で質問がされていました。
    StackOverflowの解答では、暗黙裡に参照されたプロパティや変数がnilである

    解決の解答ではありませんがご参考までに。

    キャンセル

  • 2015/05/01 15:00

    お返事が遅くなりまして、申し訳ございません。
    また、本来であれば私の方で、ご教授頂いた部分まで、
    調べるべきですが、わざわざ調べて頂きありがとうございます。

    参考ページを読んでもう少し調べていきます。
    本当にありがとうございます。

    キャンセル

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

  • ただいまの回答率 88.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る