web-dev-qa-db-ja.com

NSTimerを起動および停止するにはどうすればよいですか?

ストップウォッチアプリケーションを開発しています。私のアプリケーションには、StartBtnStopBtnの2つのUIButtonがあります。また、NSTimerを使用します。

ここで、ユーザーがNSTimerをクリックしたときにStartBtnを開始し、StopBtnをクリックしたときに停止したい。

NSTimer[MyTimerName invalidate];メソッドによって停止されることは知っていますが、NSTimerを再び開始する方法がわかりませんか?

32
user2289379

NSTimerクラスは少し使いにくいです。作成/破壊を開始/停止から分離するのではなく、すべて一緒にロールバックされます。つまり、タイマーは作成されるとすぐに開始し、破棄されるとすぐに停止します。

したがって、NSTimerオブジェクトのexistenceをフラグとして使用して、実行中かどうかを示す必要があります。このようなもの:

// Private Methods
@interface MyClass ()
{
    NSTimer *_timer;
}
- (void)_timerFired:(NSTimer *)timer;
@end

@implementation MyClass

- (IBAction)startTimer:(id)sender {
    if (!_timer) {
        _timer = [NSTimer scheduledTimerWithTimeInterval:1.0f
                                                  target:self
                                                selector:@selector(_timerFired:)
                                                userInfo:nil
                                                 repeats:YES];
    }
}

- (IBAction)stopTimer:(id)sender {
    if ([_timer isValid]) {
        [_timer invalidate];
    }
    _timer = nil;
}

- (void)_timerFired:(NSTimer *)timer {
    NSLog(@"ping");
}
91
trojanfoe

NStimerを再起動するには、常に火を使用できます

  [timer fire];

それを止めるには:

  [timer invalidate];
  //remember to set timer to nil after calling invalidate;
  timer = nil;
14
Freddy

タイマーを開始するには

#define kRefreshTimeInSeconds 1
 NSTimer *myTimerName;
 .
 .
 myTimerName = [NSTimer scheduledTimerWithTimeInterval: kRefreshTimeInSeconds 
                                   target:self 
                                   selector:@selector(handleTimer:) 
                                   userInfo:nil
                                   repeats:YES];

次に、デリゲート関数:

-(void)handleTimer: (id) sender 
{       
   //Update Values in Label here
}

タイマーを停止するには

-(void)stopTimer: (id) sender 
{       
   if(myTimerName)
   {
       [myTimerName invalidate];
        myTimerName = nil;
   }
}
8
Suresh Varma