1

私は今MacOSXプログラミングを学んでいます。私の最初のプロジェクトは、簡単なストップウォッチを書くことでした。NSTimerを使用できることは知っていますが、すべて自分で作業すれば、もっと学ぶことができると思いました。アプリは正常に動作します。ただし、ストップウォッチを再開すると、1秒おきにスキップします。

ここにコードがあります:

- (IBAction)stop:(id)sender {
    started = FALSE;
    NSLog(@"Stop pressed: %i", started);
}

- (IBAction)start:(id)sender {
    if(!started){
        started = TRUE;
        [self tock:nil];  
    }
    else {
        started = FALSE; 
    }
}

- (void) tock:(id)sender { 
     if(started == TRUE) {
         seconds++;
     };

     [self performSelector:@selector(tock:) withObject:(self) afterDelay:(1.0)];
     _anzeige.stringValue = [NSString stringWithFormat:(@"%i"), seconds];
}
4

4 に答える 4

1

ステップ1:.hファイルで次の2つの変数を宣言します

NSTimer *secondTimer;
int seconds;

ステップ2:次に2番目を0に初期化します

- (void)viewDidLoad
{
    seconds = 0;
}

ステップ3:次のメソッドを記述し、それぞれのStartメソッドとStopメソッドのIBOutletsを評価します

- (IBAction)stop:(id)sender
{
    // Check if time is enable stop it first    
    if([secondTimer isValid])
    {
        [secondTimer invalidate];
        secondTimer = nil;
    }
}

- (IBAction)start:(id)sender
{
    // Check if time is enable stop it first
    if([secondTimer isValid])
    {
        [secondTimer invalidate];
        secondTimer = nil;
    }

    // now start a new timer
    secondTimer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(tock) userInfo:nil repeats:YES];
}

- (void) tock
{
    seconds++;
    NSLog(@"%d",seconds);
    // if you want to display second in UILabel uncomment following line
    //[lbl setText:[NSString stringWithFormat:@"%d",seconds]];
}
于 2013-03-27T18:04:37.353 に答える
0

このようにして、NSDate変数lObjstrtで開始時刻を使用して

NSTimeInterval lTimeInterval=[lObjCurrentDateStr timeIntervalSinceDate:lObjstrt];
NSDate *lObjTimerDatePtr =[NSDate dateWithTimeIntervalSince1970:lTimeInterval];
NSDateFormatter *lObjDateFormatterPtr = [[NSDateFormatter alloc] init];
[lObjDateFormatterPtr setDateFormat:@"mm:ss.SS"];
[lObjDateFormatterPtr setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]];
NSString *m_cObjSprintTimePtr=[lObjDateFormatterPtr stringFromDate:lObjTimerDatePtr];
NSString *m_cObjSprintTimerValuePtr = [NSString stringWithFormat:@"%@ secs", self.m_cObjSprintTimePtr];

これにより、それに応じてタイマーを取得し、次のように停止した後にタイマーを休ませることができます。

if((NSTimer *)nil != m_cObjSprintTimerPtr) {
    [m_cObjSprintTimerPtr invalidate];
    m_cObjSprintTimerPtr = (NSTimer *)nil;
}
于 2013-03-27T10:18:17.517 に答える
0

performSelector:withObject:afterDelay:通話をキャンセルする必要があります。それ以外の場合は、を呼び出すたびにスタックしますtock:

于 2013-03-27T10:18:33.987 に答える
-1

まず第一に、あなたは通常、そのようなループを別のスレッドで開始し、フラグでそれを制御します。次に、ストッパーを正確にしたい場合は、タイマーを開始するときにタイムスタンプを保存する必要があり、タイマーループが開始タイムスタンプと現在のタイムスタンプの違いを表示するたびに表示されます。例:[[NSDate date] timeIntervalSinceDate:startDate];

于 2013-03-27T10:19:41.510 に答える