我正在学习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];
}
答案 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];