今よりもっとiOS5とiCloudを使いこなすための情報まとめ
iPhone無料iPhoneアプリまとめ完全版(2011秋版)
これまで作ったiOSアプリケーション
ツイートしてもいいですか? Follow @motomaka
2008年12月10日
■[iPhone][iPhoneSDK] iPhoneアプリを作ってみよう:第3回 タイマーアプリ(#2.ストップウォッチ作成編)
iPhoneアプリを作ってみよう:第3回 タイマーアプリの第2回です。
まずはタイマーアプリの基本中の基本、ってことで、
ストップウォッチを作ってみようと思います。
プロジェクトの作成
今回は以下の条件で作成してみます。
プロジェクト名:stopwatch
テンプレート:View-Based Application
レイアウト作成
Xcodeで、「stopwatchViewController.h」を以下のように編集します。

次にIBを起動し、以下のようにUILabel、UIButtonをViewに貼り付けます。

そして、以下のようにアウトレットします。

IBを保存して、再びXcodeへ。この辺はもうお決まりの作業ですね。
ここまでのソースは以下となります。
#import <UIKit/UIKit.h> @interface stopwatchViewController : UIViewController { IBOutlet UILabel *lbl; } @property(nonatomic,retain) UILabel *lbl; - (IBAction) start_down:(id) sender; - (IBAction) stop_down:(id) sender; - (IBAction) clear_down:(id) sender; @end
コーディング
ここまではストップウォッチのUI(Start、Stop、Clear)を構築しましたが、
次に、今回の核となるタイマー部分をコーディングしていきます。
「stopwatchViewController.h」を以下のように編集して、NSTimerの変数を定義します。

※画像は修正前なので、以下のソースと若干異なります。
ソースコードは以下。
#import <UIKit/UIKit.h> @interface stopwatchViewController : UIViewController { IBOutlet UILabel *lbl; NSTimer *timer; } @property(nonatomic,retain) UILabel *lbl; -(void)onTimer:(NSTimer*)timer; - (IBAction) start_down:(id) sender; - (IBAction) stop_down:(id) sender; - (IBAction) clear_down:(id) sender; @end
次に「stopwatchViewController.m」の「viewDidLoad」を以下のように編集してください。

※画像は修正前なので、以下のソースと若干異なります。
ソースコードは以下。
- (void)viewDidLoad { [super viewDidLoad]; timer = [NSTimer scheduledTimerWithTimeInterval:(0.001) target:self selector:@selector(onTimer:) userInfo:nil repeats:YES]; }
Viewがロードされた時に実行されるこの部分は、以下の意味があります。
「onTimerという処理を、0.001秒間隔で繰り返し実行する」
後はonTimerの中身を作ればいいわけですが、難しく考える必要はなく、
Startボタンを押した時点から現時点の秒数をラベルに表示すればOKです。
そうすれば、onTimerは0.001秒間隔でどんどん実行しろ、と指定されているので
あたかもミリ秒単位のカウンターがもの凄い速さで動いているように見える、というわけです。
そのコーディング内容が以下です。

※画像は修正前なので、以下のソースと若干異なります。
ソースコードは以下。
#import "stopwatchViewController.h" @implementation stopwatchViewController @synthesize lbl; NSDate *stdate; BOOL timeflg=FALSE; - (void)onTimer:(NSTimer*)timer { if(timeflg){ NSDate *now = [NSDate date]; self.lbl.text = [NSString stringWithFormat:@"%.3f", [now timeIntervalSinceDate:stdate]]; } } -(IBAction) start_down:(id) sender{ timeflg = TRUE; stdate = [NSDate date]; [stdate retain]; }
「timeflg」は初期値はFlaseで、Startボタンがタップされた時にTrueになります。
こうしておかないと、アプリを起動したらすぐにカウントが始まってしまうので
通常はFalseにしておくわけですね。
このロジックの考え方は以下です。
- 1.Startボタンをタップすると「timeflg」がTrueになってカウンター始動。
- 2.この時の日時を「stdate」に保持する。
- 3.stdateを「retain」して、継続して利用可能に。
- 4.onTimer内で、その時点の日付(now)を取得。
- 5.stdateとnowの間隔をミリ秒単位でラベルに表示する。
※stringWithFormatの他のパラメータについては、NSString:stringWithFormat:が参考になります。
次に、StopとClearですが、これは単純に「timeflg」をFalseにすればOKです。

ソースコードは以下。
-(IBAction) stop_down:(id) sender{
timeflg = FALSE;
}
-(IBAction) clear_down:(id) sender{
timeflg = FALSE;
self.lbl.text = @"0.000";
}
これをシミュレータで実行すると、こんな感じです。

画像なので止まってますがw
実際には1/1000秒単位のストップウォッチとして動作しています。
<追記>
間隔に0.001を指定してはいますが、実際には正確にその間隔では動作しないと思われます。
※では、どれくらいの間隔までなら大丈夫なのか、については未検証なのでわかりません。
というか、例えば0.1秒間隔にしたところで、iPhoneOSの処理が重くなってしまったら
0.1秒ごとに処理を回すことすら出来なくなってしまうこともあったりします。
なので、ストップウォッチ的には処理間隔自体はさほど重要ではなく、
「処理が行われる実際の間隔に影響しない結果を表示する」ということが
ストップウォッチ的には大事だと思われます。
もちろん本内容でそれは大丈夫なのか?という懸念はあるでしょうが、
そもそも本チュートリアルの目的はそういうのとは趣が少々違うので。
なお、本内容で「0.001」を指定しているのは、「そういう指定も出来ますよ」
という程度の意味で捉えてもらえればいいと思います。
いかがでしたでしょうか?
タイマーの基本はこんな感じです。
今回は1/1000秒単位で実行していますが、必要に応じて間隔を変えてあげれば、
例えば10分おきに何かをチェックする、ということも可能となるわけですね。
次回はタイマーアプリというとちょっと違うんですが、Tab Barアプリの
基本について解説しようと思います。
目標とする形を考えると必要だし、View-Basedばかりだと飽きてしまうのでw
たまには気分転換も必要ですね(^o^)

