我正在Objective-C制作一个秒表:
- (void)stopwatch
{
NSInteger hourInt = [hourLabel.text intValue];
NSInteger minuteInt = [minuteLabel.text intValue];
NSInteger secondInt = [secondLabel.text intValue];
if (secondInt == 59) {
secondInt = 0;
if (minuteInt == 59) {
minuteInt = 0;
if (hourInt == 23) {
hourInt = 0;
} else {
hourInt += 1;
}
} else {
minuteInt += 1;
}
} else {
secondInt += 1;
}
NSString *hourString = [NSString stringWithFormat:@"%d", hourInt];
NSString *minuteString = [NSString stringWithFormat:@"%d", minuteInt];
NSString *secondString = [NSString stringWithFormat:@"%d", secondInt];
hourLabel.text = hourString;
minuteLabel.text = minuteString;
secondLabel.text = secondString;
[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(stopwatch) userInfo:nil repeats:YES];
}
如果您想知道,秒表有三个单独的标签,分钟,分钟和秒。但是,而不是按1计数,它计为2,4,8,16等。
此外,代码的另一个问题(相当小的一个)是它不会将所有数字显示为两位数。例如,它将时间显示为0:0:1,而不是00:00:01。
非常感谢任何帮助!我应该补充一点,我是Objective-C的新手,所以请尽量保持简单,谢谢!!
答案 0 :(得分:3)
如果您在每次迭代时安排计时器,请不要使用repeats:YES
。
你在每次迭代时产生一个计时器,并且计时器已经重复,导致计时器呈指数增长(因此方法调用stopwatch
)。
将计时器实例化更改为:
[NSTimer scheduledTimerWithTimeInterval:1.0f
target:self
selector:@selector(stopwatch)
userInfo:nil
repeats:NO];
或在stopwatch
方法
对于第二个问题,只需使用正确的格式字符串。
NSString *hourString = [NSString stringWithFormat:@"%02d", hourInt];
NSString *minuteString = [NSString stringWithFormat:@"%02d", minuteInt];
NSString *secondString = [NSString stringWithFormat:@"%02d", secondInt];
%02d
将打印一个十进制数,用0
填充长度为2,这正是你想要的。
(source)
答案 1 :(得分:0)
对于第一个问题,而不是为每个调用创建一个计时器实例。移除行
[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(stopwatch) userInfo:nil repeats:YES];
来自功能秒表。
用上面的行替换你对秒表功能的调用。即替换
[self stopwatch]
与
[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(stopwatch) userInfo:nil repeats:YES];