恢复计时器后,计时器计数快两倍

时间:2013-03-27 09:55:37

标签: iphone ios objective-c cocoa-touch nstimer

我正在学习Mac OS X编程。我的第一个项目是写一个简单的秒表。我知道你可以使用NSTimer,但我想我会学到更多,如果我所有的工作都是我自己的。该应用程序正常。但是在恢复秒表之后,它会跳过每秒钟的数字......

这里是代码:

- (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 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

您需要取消performSelector:withObject:afterDelay:来电。否则,每次拨打tock:时,他们都会堆叠起来。

答案 2 :(得分:0)

步骤1:在.h文件中声明以下两个变量

NSTimer *secondTimer;
int seconds;

步骤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]];
}

答案 3 :(得分:-1)

首先,你通常只是在单独的线程中启动这样的循环并用标志来控制它。 其次,如果你想让你的塞子准确,你必须在启动计时器时保存时间戳,每次你的计时器循环显示开始时间戳和当前时间戳之间的差异。例:     [[NSDate date] timeIntervalSinceDate:startDate];