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

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

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

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

Swift

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

Q&A

解決済

2回答

4526閲覧

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

123daaa

総合スコア69

Xcode

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

Swift

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

0グッド

1クリップ

投稿2015/04/17 11:11

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" }

}

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

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

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

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

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

guest

回答2

0

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

投稿2015/04/18 05:14

at1994

総合スコア202

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

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

123daaa

2015/04/21 09: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) 前回とは異なるエラーです。。 ご教授頂ければ幸いです。。
at1994

2015/04/21 14: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である 解決の解答ではありませんがご参考までに。
123daaa

2015/05/01 06:00

お返事が遅くなりまして、申し訳ございません。 また、本来であれば私の方で、ご教授頂いた部分まで、 調べるべきですが、わざわざ調べて頂きありがとうございます。 参考ページを読んでもう少し調べていきます。 本当にありがとうございます。
guest

0

ベストアンサー

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

投稿2015/04/17 15:21

at1994

総合スコア202

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

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

123daaa

2015/04/17 15:48

ありがとうございます。初心者なので、教本などを真似ている段階ですが、少し自分のアイディアとして、カスタマイズを行っている段階です。 @IBAction func stopTimer(sender: AnyObject) 上記のメソッド内に入れるんですね。参考になります。 別件ですが、不明なエラーが起きました。もしお判りでしたら、ご教授ください。 上記のコードは教本の通りに真似ただけです。 しかし、 @IBOutlet weak var page: UILabel! この一行は自分で追加しました。 UI部品(ラベル)とコードを接続したものです。 これを追加して、 func update() { 上記のメソッドで実際に、新たな表示をしました。 ここからが本題ですが、 上記の作業中、突然、 thread 1 signal sigabrt というエラーが出てきました。 該当箇所は以下の部分です。 class AppDelegate: UIResponder, UIApplicationDelegate { 自分で調べたところ、UI部品とコードの接続において、 なにかうまく繋がっていない(定義されていないところがある) というところまで辿りつけました。 一体、原因は何なんでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問