如何在iOS中从零启动计时器

时间:2016-07-16 07:47:21

标签: ios nstimer nsdateformatter

我有一个按钮,我放置了一个UITapGestureRecognizer。当我点击该按钮时,我会调用一个开始时间的方法。 我的问题是,我能够在标签上获得计时器字符串。但计时器从当前日期时间开始,我想从零开始计时器(如倒数计时器)。下面是我的计时器代码。

-(IBAction)micPressed{
if (gestureRecognizer.state==UIGestureRecognizerStateBegan) {
    gestureRecognizer.view.alpha=0.2f;

    [label setHidden:NO];

    if (!_timer) {
        _timer = [NSTimer scheduledTimerWithTimeInterval:0.1f
                                                  target:self
                                                selector:@selector(_timerFired:)
                                                userInfo:nil
                                                 repeats:YES];
    }
}
else{
    [label setHidden:YES];

    gestureRecognizer.view.alpha=10.2f;
    if ([_timer isValid]) {
        [_timer invalidate];
    }
    _timer = nil;
}

}

- (void)_timerFired:(NSTimer *)timer {

 NSDateFormatter *dateformatter=[[NSDateFormatter alloc]init];
[dateformatter setDateFormat:@"mm:ss:SSS"];

NSString *dateInStringFormated=[dateformatter stringFromDate:[NSDate dateWithTimeIntervalSinceNow:0]];
NSLog(@"%@",dateInStringFormated);
[label setText:dateInStringFormated];
}

请有人建议我解决方案。任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:0)

问题是你是从当前时间开始计时器。做一个像倒数计时器。您需要执行以下操作:

  1. 从名为int Counter获取并0
  2. 对其进行初始化
  3. 解雇您的NSTimer并在此时增加计数器
  4. UILabel文字中显示计数器值。
  5. NSTimer停止后,再次转到0
  6. 那就是它!这就是你如何达到预期效果的方法。

      

    代码:

    int counter = 0;
    
    - (void)_timerFired:(NSTimer *)timer {
        counter++;
    }
    

    再次NSTimer无效后,请转到counter = 0

答案 1 :(得分:0)

您的代码应该是,

 NSDateFormatter *dateformatter=[[NSDateFormatter alloc]init];
[dateformatter setDateFormat:@"mm:ss:SSS"];

NSString *dateInStringFormated=[dateformatter stringFromDate:[dateformatter dateFromString:@"00:00:000"]];
NSLog(@"test : %@",dateInStringFormated);

我只是[NSDate dateWithTimeIntervalSinceNow:0][dateformatter dateFromString:@"00:00:000"]进行混淆。

始终为零。

更新:

我认为你需要像计时器那样更新分钟,秒和毫秒,因为我现在理解你的问题。你可以实现类似的目标,

安排计时器,

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

现在你的updateTimer应该是,

 -(void)updateTimer{

 static double counter = 0;

 static int counter2 = 0;


int seconds = (int)counter % 60;
int minutes = ((int)counter / 60) % 60;


NSLog(@"%02d:%02d:%03d",minutes,seconds,counter2); // This should be your labels text that updating continuously




counter = counter + 0.01;
counter2++;

if (counter2 == 100) {
    counter2 = 0;
}
}

希望这会有所帮助:)

答案 2 :(得分:0)

记住启动计时器的时间:

_startDate = [NSDate date];
_Timer = ...

然后在_timerFired方法中使用自开始日期以来的时间间隔:

NSDateComponentsFormatter *formatter = [[NSDateComponentsFormatter alloc] init];
NSString *dateInStringFormatted = [formatter stringFromTimeInterval:[[NSDate date] timeIntervalSinceDate:_startDate]];