1

因此,在查看了此站点上可能的每个 NSTimer 暂停/恢复之后,在恢复计时器方面对我没有任何帮助。暂停和启动计时器完美无缺,没有问题。另一方面,Resume 功能什么都没有。

我的计时器由

[tickerTimer invalidate];
tickerDate = [NSDate date];
tickerTimer = [NSTimer scheduledTimerWithTimeInterval:.01 target:self selector:@selector(runTimer) userInfo:nil repeats:YES];

还有计时器本身

-(void)runTimer {
    NSTimeInterval interval = [tickerDate timeIntervalSinceNow];
    seconds = ABS((int)interval);
    minutes = seconds/60;
    hours = minutes/60;
    hhmmssLabel.text = [NSString stringWithFormat:@"%02d:%02d:%02d", hours, minutes%60, seconds%60];
}

暂停功能是

pauseStart = [NSDate dateWithTimeIntervalSinceNow:0];
previousFireDate = [tickerTimer fireDate];
NSDate *date = [NSDate distantFuture];
[tickerTimer setFireDate:date];

最后那份不起作用的简历是

float pauseTime = -1*[pauseStart timeIntervalSinceNow];    
[tickerTimer setFireDate:[NSDate dateWithTimeInterval:pauseTime sinceDate:previousFireDate]];

我是在错误地使用 fireDate 还是有更好的方法来暂停和恢复?

4

2 回答 2

2

为什么不使当前计时器无效并创建一个新的计时器实例?

喜欢:

-(void)pauseTimer
{
    [tickerTimer invalidate];
}

-(void)resumeTimer
{
    tickerTimer = [NSTimer scheduledTimerWithTimeInterval:.01 target:self selector:@selector(runTimer) userInfo:nil repeats:YES];
}
于 2013-06-25T11:59:03.983 回答
0

您不能暂停计时器。但是,当用户进入设置视图时,您可以保存计时器的 fireDate 以及当前日期。在此之后,您使计时器无效并让用户做他/她的事情。一旦他/她切换回游戏,您创建一个新的计时器对象并将触发日期设置为旧触发日期加上用户在菜单中的时间(oldTime + currentTime)。

您可以使用此代码在 NSTimer 中实现暂停和恢复功能

//=========新定时器更新方法==============

-(void) updateTimer {

NSDate *currentDate = [NSDate date];

NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:startDate];
NSDate *timerDate = [NSDate dateWithTimeIntervalSince1970:timeInterval];


NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"mm:ss.S"];
[dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]];

NSString *timeString = [dateFormatter stringFromDate:timerDate];
lblMessage.text = timeString;
pauseTimeInterval = timeInterval;

}

 -(IBAction) startBtnPressed:(id)sender
    {
//=============================new update with start pause==================
if(running == NO) {
    running = YES;

    startDate = [NSDate date] ;
    startDate = [[startDate dateByAddingTimeInterval:((-1)*(pauseTimeInterval))] retain];
    stopWatchTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/10.0 target:self selector:@selector(updateTimer) userInfo:nil repeats:YES];
}
else {
    running = NO;
    [stopWatchTimer invalidate];
    stopWatchTimer = nil;
    [self updateTimer];
}
}

在 .h 文件中声明 NSDate startDate;

    NSTimeInterval pauseTimeinterval; and in viewdidload pausetimeInterval=0.0; 

如果您遇到问题,请告诉我。

于 2013-06-25T12:56:46.050 回答