2011-10-21 11 views
0

iPhoneのNSTimerが新しくなりました。私はストップウォッチを作った。今私は の間の時間を休止したいとまた再開を一時停止するしたいと思います。私のコードは以下の通りです。iPhoneで時計タイマーを停止しますか?

  • 時間を一時停止するにはどうすればよいですか?
  • 時間の停止場所から再開するにはどうすればよいですか?

開始時間:

startDate = [[NSDate date]retain]; 
stopWatchTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/10.0 
                 target:self 
                selector:@selector(updateTimer) 
                userInfo:nil 
                repeats:YES]; 

停止時間:

[stopWatchTimer invalidate]; 
stopWatchTimer = nil; 
[self updateTimer]; 

更新時間:

(void)updateTimer 
{ 
    NSDate *currentDate = [NSDate date]; 
    NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:startDate]; 
    NSDate *timerDate = [NSDate dateWithTimeIntervalSince1970:timeInterval]; 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat:@"mm:ss"]; 
    [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]]; 
    NSString *timeString=[dateFormatter stringFromDate:timerDate]; 
    stopWatchLabel.text = timeString; 
    [dateFormatter release]; 
} 

答えて

1

NSTimerが一時停止または再開する方法はありません。 2種類のタイマーを作ることができます。タイマーは1回だけ実装し、2回めは繰り返します。例:

1秒ごとにコールバックmyMethodを入力するタイマーを作成します。

NSTimer *myTimer = [NSTimer scheduledTimerWithTimeInterval:1 
    target:self 
    selector:@selector(myMethod:) 
    userInfo:nil 
    repeats:YES]; 

あなたはおそらく、あなたのクラスであなたには、いくつかの

BOOL pausevariableを維持しなければならないし、コールバックで次の操作を行いMyMethodはどこあなたの目的のために、このいずれかを選択します:

あなたが一時停止を更新し
- (void) myMethod:(NSTimer *) aTimer 
{ 
    if (!pause) { 
     // do something 
     // update your GUI 
    } 
} 

あなたのコード。タイマーを停止してメモリを解放するには、

[myTimer invalidate]; 

希望をこちらに電話してください。

+0

NSTimerには一時停止と再開の方法がないことがわかります。しかし、私はどのように休止するかについては何も考えていないので、タイマーを休止するロジックがあります。ちなみにあなたの賛辞のおかげで。 – Rishabh

+2

なぜあなたは「iPhoneでNSTimerを初めて使ったのですか?私はストップウォッチをしました。今はその間を休止したい、また再開を一時停止したいと思っています。 :) – Gabe

+0

私のプログラムに一時停止ボタンを追加したいので...... – Rishabh

3

私は、経過時間に追跡を支援するために、いくつかの余分な変数を作成した:私はwatchStart = NOとpauseTimeInterval = 0.0を設定し

  1. BOOL watchStart;
  2. NSTimeInterval pauseTimeInterval;

を。

私は、その開始または一時停止状態ならば(私のIBActionのために)チェックするwatchStartを使用し、updateTimerに、私はpauseTimeIntervaltimeIntervalを設定します。

コードの重要な部分は、次のとおりです。ラインが一時停止された時間の計算のためにstartDateに余分timeIntervalを追加します

_startDate = [_startDate dateByAddingTimeInterval:((-1)*(_pauseTimeInterval))] 

。それは以前に記録された間隔で追加するのに適時に "ステップバック"のようなものです。上記の例のための

-(void) updateTimer { 

    NSDate *currentDate = [NSDate date]; 

    NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:_startDate];  
    NSDate *timerDate = [NSDate dateWithTimeIntervalSince1970:timeInterval]; 


    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat:@"mm:ss.S"]; 
    [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]]; 

    NSString *timeString = [dateFormatter stringFromDate:timerDate]; 
    _stopWatchLabel.text = timeString; 
    _pauseTimeInterval = timeInterval; 

} 



-(IBAction)btnStartPause:(id)sender { 

    if(_watchStart == NO) { 
     _watchStart = YES; 
     _startDate = [NSDate date]; 
     _startDate = [_startDate dateByAddingTimeInterval:((-1)*(_pauseTimeInterval))]; 
     _stopWatchTime = [NSTimer scheduledTimerWithTimeInterval:1.0/10.0 target:self selector:@selector(updateTimer) userInfo:nil repeats:YES]; 
    } 
    else { 
     _watchStart = NO; 
     [_stopWatchTime invalidate]; 
     _stopWatchTime = nil; 
     [self updateTimer]; 
    } 
0

小補正:

_startDate = [[_startDate dateByAddingTimeInterval:((-1)*(_pauseTimeInterval))]retain]; 

これは

5

:-)あなたはNSTimeIntervalを使用することができます物事が良くなります。

_startDate = [_startDate dateByAddingTimeInterval:((-1)*(_pauseTimeInterval))]; 

が終わり@保持追加タイマーの代わりに。私はタイマーを一時停止して停止する機能的なコードを持っています。

@interface PerformBenchmarksViewController() { 

    int currMinute; 
    int currSecond; 
    int currHour; 
    int mins; 
    NSDate *startDate; 
    NSTimeInterval secondsAlreadyRun; 
} 

@end 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    running = false; 
} 

- (IBAction)StartTimer:(id)sender { 

    if(running == false) { 

     //start timer 
     running = true; 
     startDate = [[NSDate alloc] init]; 
     startTime = [NSDate timeIntervalSinceReferenceDate]; 
     [sender setTitle:@"Pause" forState:UIControlStateNormal]; 
     [self updateTime]; 
    } 
    else { 
     //pause timer 
     secondsAlreadyRun += [[NSDate date] timeIntervalSinceDate:startDate]; 
     startDate = [[NSDate alloc] init]; 
     [sender setTitle:@"Start" forState:UIControlStateNormal]; 
     running = false; 
    } 
} 

- (void)updateTime { 

    if(running == false) return; 

    //calculate elapsed time 
    NSTimeInterval currentTime = [NSDate timeIntervalSinceReferenceDate]; 
    NSTimeInterval elapsed = secondsAlreadyRun + currentTime - startTime; 

    // extract out the minutes, seconds, and hours of seconds from elapsed time: 
    int hours = (int)(mins/60.0); 
    elapsed -= hours * 60; 
    mins = (int)(elapsed/60.0); 
    elapsed -= mins * 60; 
    int secs = (int) (elapsed); 

    //update our lable using the format of 00:00:00 
    timerLabel.text = [NSString stringWithFormat:@"%02u:%02u:%02u", hours, mins, secs]; 

    //call uptadeTime again after 1 second 
    [self performSelector:@selector(updateTime) withObject:self afterDelay:1]; 
} 

希望すると、これが役に立ちます。

- (IBAction)pauseT:(id)sender { 
se = sec; 
mi = min; 
ho = hour; 
[timer invalidate]; 

は、次のように私たちは、私は一時停止を実装することに成功したとiOSタイマーアプリに機能を再開

+0

便利で分かりやすく、私の問題を解決します。しかし、経過時間から時間を抽出するときは、次のようにする必要があります。 'int hours =(int)(elapsed/3600.00); elapsed - = hours * 3600; ' それ以外の場合は、60分後に間違っています。 – Alison

0
-(void)startStopwatch 
{ 

//initialize the timer HUD 
[self setSeconds:second]; 
// [self.hud.stopwatch setSeconds:_secondsLeft]; 

//schedule a new timer 
_timer = [NSTimer scheduledTimerWithTimeInterval:1.0 
              target:self 
             selector:@selector(tick:) 
             userInfo:nil 
             repeats:YES]; 
} 

-(void)pause{ 

[_timer invalidate]; 
} 

-(void)resume { 

[_timer isValid]; 

} 

は、コード}があります

- (IBAction)resumeT:(id)sender { 
sec = se; 
min = mi; 
hour = ho; 
timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(countDown) userInfo:nil repeats:YES]; 

これはあなたのために働くことを願っています..

0

友人を一時停止し、タイマーを再開することができますおかげで、このコードを使用して

関連する問題