Cocoa(Objective-C) iPhone勉強

タイマー表示

[`evernote` not found]
LINEで送る
Pocket

今作っているアプリで時間経過を表示する必要がありましたので、サンプルを作成しました。

ほとんどこちらのサイト様を参考にしています。ありがとうございます。

http://cocoa.synck.jp/1237172145.html


一式はgithubにおきましたので、必要でしたらこちらからどうぞ。
http://github.com/mmlemon/iPhoneTimerSample/tree/master

ストップウォッチアプリのキャプチャ
ストップウォッチアプリのキャプチャ

操作方法:

  • Startボタンをタップ:計測開始
  • Stopボタンをタップ:計測終了
  • 再びStartをタップした場合、0秒から再計測します

ソースについて:

時間を測る事は、

開始時刻をNSTimeIntervalで保持します。

現在時刻を保持する方法は、

NSTimeInterval time = [NSDate timeIntervalSinceReferenceDate];

を使うだけです。

二つのNSTimeIntervalを比較するには、単純に引き算するだけです。

NSTimeInterval currentTime = [NSDate timeIntervalSinceReferenceDate] – time;

(※timeは計測開始時刻を保持するNSTimeInterval)

定期的に表示時刻をアップデートするにはNSTimerを使います。こんな感じ。


self.timer =  [NSTimer scheduledTimerWithTimeInterval: 0.01                                   target:self                                  selector:@selector(updateTimer:)                                  userInfo:nil                                   repeats:YES];

scheduledTimerWithTImeIntervalがタイマーが呼ばれる期間であり、

selectorがこのscheduledTimerWithTimeIntervalで定期的に呼ばれるセレクタ(メソッド?)である、という事を押さえておけばよいと思います。

ちなみに、selectorで呼ばれるものは、

-(void)updateTimer:(NSTimer *)t

のようになる必要があります。

ここで経過時刻を測定、表示すれば継続的に表示が更新されるようになります。

タイマーを終了する場合は、

[self.timer invalidate];

として下さい。

追記1:

開始時刻と累積時刻が二重に存在しているので上手くないですね。。

追記2:

github初めて使ったんですけど、つまらないところでひっかかっちゃいましたが、それはまた別記事にします。

追記3:

こんな程度の内容ですが、記事を書く事で改めて気づく事がありました。

これからも続けようと思います。


4 Comments

  1. とても勉強になります。

    ストップウォッチを作っててつまづいたのですが、

    スタートとストップを同じボタンにするには、どうしたらいいでしょうか?

    いきなりの質問で大変恐縮ですが、お時間のある時 気が向いたらアドバイス頂けないでしょうか
    お願いします。

  2. > mammamさん
    コメントありがとうございます!とてもうれしいです。

    さて、スタートとストップを同じボタンにする方法ですが、
    ひとまずは状態管理用にフラグを用意するのはいかがでしょうか。
    タイマーが動作しているときと動作していない時でフラグを用意し、ボタンを押された時のハンドラ内で開始処理と停止処理を振り分ける、という方法です。

    例えば、
    状態用のフラグとして、
    BOOL starting;
    を用意。(YESならタイマー動作中、NOであれば停止中)

    ボタンが押されたときに
    -(IBAction)btnPressed:(id)sender;
    を呼ばれるように設定します。
    -(IBAction)btnPressed:(id)sender
    {
    if(starting)
    { // タイマー動作中なら、タイマーを停止し、ラベルを”start”に変更する。
    [self stopTimer];
    [btn setTitle:@”start” forState:UIControlStateNormal&UIControlStateHighlighted];
    starting = NO;
    }
    else { // タイマー停止中なら、タイマーを再開し、ラベルを”stop”に変更する
    [self startTimer];
    [btn setTitle:@”stop” forState:UIControlStateNormal&UIControlStateHighlighted];
    starting = YES;
    }
    }
    ※ [self startTimer], [self stopTimer]はタイマーの開始/停止メソッドです。

    こんなところでいかがでしょうか?
    なにかあればお気軽にコメント下さいね!

  3. はじめまして

    最近Iphoneプログラミングの勉強を始めました。
    上記のスタートとストップを同じボタンにするにはをためしてみたんですが、
    上手くいきません。。。

    もし可能でしたら上記のソースもgithub載せて頂けないでしょうか?

    よろしく御願い致します。

コメントを残す

メールアドレスが公開されることはありません。