NSTimerでiPhoneのストップウォッチ的(超劣化版)なものをちょっと試す
NSTimerを使って時計アプリを作っているので、少しずつできた事をメモします。
NSTimerは定期的に処理を実行するものなので、そのままでは時計になってくれません。
とりあえず1秒毎に00:00(mm:ss)の形式でUILabelを更新したいなと思いました。
iPhoneデフォルトのストップウォッチの劣化版のように動いて、
3:00でタイマーが止まるようにしてみます。
まずは動けば、というコードなので有識者は是非アドバイスして下さい。
まずGUIの配置です。
ラベルとボタンを置いて、アウトレットとアクションを引きます。
hファイルです。NSTimerはインスタンス変数にしてます。
#import <UIKit/UIKit.h> @interface TESTViewController : UIViewController { NSTimer *myTimer; //一定間隔でなにかする為のタイマー BOOL isStart; //タイマーが動いているかのフラグ BOOL isFstCalled; //タイマーがはじめて呼ばれたフラグ int secTime; //秒を表す変数 int minTime; //分を表す変数 } @property (strong, nonatomic) IBOutlet UILabel *timeLabel; - (IBAction)timerStartAction:(id)sender; @end
次にmファイルにいきます。
まずはviewDidLoad
/** ここでタイマーを初期化して別メソッドでFireします*/ - (void)viewDidLoad { [super viewDidLoad]; /** * NSTimerのインスタンスを取得するクラスメソッド scheduledTimerWithTimeInterval * [引数] * 1.何秒毎に動くか * 2.更新メソッドの呼び出し先 * 3.更新メソッド名 * 4.補足情報 * 5.繰り返すかどうか * * 「fireメソッド」でタイマーをスタートし、「invalidateメソッド」でタイマーを削除する。 */ myTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(update) userInfo:nil repeats:YES]; isStart = NO; isFstCalled = NO; }
次にアクション
/** スタートボタンで呼ばれるメソッド */ - (IBAction)timerStartAction:(id)sender { if (isFstCalled) { [myTimer fire]; isFstCalled = YES; } isStart = !isStart; }
最後に更新メソッドです。
/** 1秒毎に呼ばれる更新メソッド */ - (void)update{ //タイマーがスタートしているかどうか if (isStart) { secTime++; if (secTime == 60) { if (minTime == 2) { isStart = NO; minTime = 3; [myTimer invalidate]; myTimer = nil; } else{ minTime++; } secTime = 0; } self.timeLabel.text = [NSString stringWithFormat:@"%02d:%02d",minTime,secTime]; } else{ self.timeLabel.text = [NSString stringWithFormat:@"%02d:%02d",minTime,secTime]; } }
うーん、誰かもっと楽な方法あれば教えて下さい。