如何在iOS中创建计数计时器

时间:2014-10-10 07:07:28

标签: ios timer

我有这段代码:

NSDate *now = [NSDate date];

static NSDateFormatter *dateFormatter;
if (!dateFormatter) {
    dateFormatter = [[NSDateFormatter alloc] init];
    dateFormatter.dateFormat = @"h:mm:ss";
}
recordStatusLabel.text = [dateFormatter stringFromDate:now];
NSLog(@"Time now: %@", [dateFormatter stringFromDate:now]);

计算当前时间。如何将其更改为以此格式启动?

  

00:00:00(小时:分钟:秒)

来自NSString变量:

示例:我的变量

得到了这个值
NSString * time = @"02:16:23";

然后计数器将继续计数: 2时16分24秒 。 。 。 2点20分13秒

2 个答案:

答案 0 :(得分:4)

创建NSTimer类的实例,并使用重复选项YES为事件触发设置1秒的时间。在事件处理中,使用当前时间更新标签。当您的功能完成后,使计时器无效以停止触发事件。

以下是创建NSTimer类实例的代码:

NSTimer *countUpTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self 
                             selector:@selector(countUpTimerFired:) userInfo:nil repeats:YES];

以下是事件处理的方法:

- (void)countUpTimerFired:(id)sender {
    dispatch_async(dispatch_get_main_queue(), ^{
        recordStatusLabel.text = [dateFormatter stringFromDate:[NSDate date]];
    });
}

保留dateFormattercountUpTimer作为类变量。

当您从当前设备时间开始计时时,这是实现所需功能的简单方法;所以你不需要额外的努力从标签中获取价值,递增价值然后转换回字符串。


修改

如果要从任何其他时间值或字符串启动计数器,可以保留一个整数变量以保持时间值(以秒为单位)。然后在调用timer事件时(每秒)递增值,然后将该整数转换为时间字符串。

这里是初始值的代码:

NSString *timeString = recordStatusLabel.text; //contains a string in time format like @"2:16:23" or @"00:00:00" or current time or any other value.

NSArray *timeComponents = [timeString componentsSeparatedByString:@":"];

int timeInSeconds = [timeComponents[0] intValue]*3600 + [timeComponents[1] intValue]*60 + [timeComponents[2] intValue];

在处理计时器的事件中:

- (void)countUpTimerFired:(id)sender {
    timeInSeconds++;
    int hours = timeInSeconds/3600;
    int minutes = (timeInSeconds%3600)/60;
    int seconds = timeInSeconds%60;

    dispatch_async(dispatch_get_main_queue(), ^{
        [recordStatusLabel setText:[NSString stringWithFormat:@"%d:%02d:%02d", hours, minutes, seconds]];
    });
}

答案 1 :(得分:1)

由于您正在处理最快值为秒的计时器,因此为了达到性能,您只需触发一个每秒重复一次的计时器。

声明您的实例变量

@implementation Yourclass {
    NSDate *startDate;
    NSTimer *yourTimer;
    NSString *myTime;
}

单击按钮启动计时器

-(IBAction)startTimer:(id)sender {
    startDate = [NSDate date];
    yourTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timeHandler:) userInfo:nil repeats:YES];

    [yourTimer fire];
}

实现您的方法,即timer

的处理程序方法
-(void)timeHandler:(NSTimer *)myTimer {
    //Difference between dates in seconds
    NSTimeInterval elapsedTime = [startDate timeIntervalSinceNow];

    //Divide by 3600 to get the hours
    NSInteger hours = elapsedTime/3600;

    //Divide by 60 to get the minutes
    NSInteger minutes = elapsedTime/60;
    NSInteger seconds = elapsedTime;

    myTime = [NSString stringWithFormat:@"%i:%i:%i",hours, minutes, seconds];

    // update the label
    recordStatusLabel.text = myTime;
}