如何在iphone中暂停和恢复NSTimer
你好 我正在开发小游戏应用程序。 当用户转到另一个视图[说设置视图]时,我需要暂停计时器。 当用户返回该视图时,我需要恢复计时器 谁能解决这个问题如何在iphone中暂停和恢复NSTimer,iphone,objective-c,ios4,nstimer,nstimeinterval,Iphone,Objective C,Ios4,Nstimer,Nstimeinterval,你好 我正在开发小游戏应用程序。 当用户转到另一个视图[说设置视图]时,我需要暂停计时器。 当用户返回该视图时,我需要恢复计时器 谁能解决这个问题 提前感谢…您不能暂停NSTimer。但是,您可以在需要时使其无效并创建一个新的计时器。您不能暂停计时器。但是,当用户转到设置视图时,可以保存计时器的fireDate,也可以保存当前日期。在此之后,您将使计时器无效,并让用户执行他/她的操作。 一旦他/她切换回游戏,您将创建一个新的计时器对象,并将点火日期设置为旧的点火日期加上用户在菜单中的时间(old
提前感谢…您不能暂停NSTimer。但是,您可以在需要时使其无效并创建一个新的计时器。您不能暂停计时器。但是,当用户转到设置视图时,可以保存计时器的
fireDate
,也可以保存当前日期。在此之后,您将使计时器无效,并让用户执行他/她的操作。
一旦他/她切换回游戏,您将创建一个新的计时器对象,并将点火日期设置为旧的点火日期加上用户在菜单中的时间(oldTime+currentTime)。NSTimer不允许您暂停它。但是,通过几个简单的变量,您可以自己创建效果:
NSTimer *timer;
double timerInterval = 10.0;
double timerElapsed = 0.0;
NSDate *timerStarted;
-(void) startTimer {
timer = [NSTimer scheduledTimerWithTimeInterval:(timerInterval - timerElapsed) target:self selector:@selector(fired) userInfo:nil repeats:NO];
timerStarted = [NSDate date];
}
-(void) fired {
[timer invalidate];
timer = nil;
timerElapsed = 0.0;
[self startTimer];
// react to timer event here
}
-(void) pauseTimer {
[timer invalidate];
timer = nil;
timerElapsed = [[NSDate date] timeIntervalSinceDate:timerStarted];
}
这对我来说很好
您可以使用此代码在NSTimer中实现暂停和恢复功能
在.h文件中声明NSDate startDate
n时间间隔暂停时间间隔;
在viewdidload pausetimeInterval=0.0;祝你好运
你最终弄明白了吗?我看到你说当你进入另一个视图时,你不能使计时器失效。你能解释一下你的意思吗?NSTimer不能暂停,模拟暂停它们的方法通常包括使它们无效。然后,您可以通过创建一个新的计时器来模拟“取消暂停”,该计时器将再次启动。这将模拟暂停和取消暂停的计时器 对于希望使用可能更方便的方法的人,我编写了一个控制器类,可以方便地处理暂停和取消暂停计时器。你可以在这里找到它: 您可以使用我编写的控制器类来创建新的计时器,然后可以通过调用控制器类上的“pauseTimer”和“unpauseTimer”方法来暂停和取消暂停计时器
我将非常感谢任何评论或反馈,如您如何使用它,您希望看到什么变化,或您希望我添加的任何功能。请毫不犹豫地在此处回复您的评论,或在Github页面的“问题”选项卡上发布。谢谢,但我不能使其无效,因为当我转到另一个视图并返回时,它应该从停止的位置开始。谢谢,但我对iphone是新手。你能给我提供一些演示示例,以便我能轻松地阅读。@JustSid,你能为这个提供示例代码吗?。我知道这已经有几年了,但我有必要提出一个新的问题。:)
NSTimer *timer;
double timerInterval = 10.0;
double timerElapsed = 0.0;
NSDate *timerStarted;
-(void) startTimer {
timer = [NSTimer scheduledTimerWithTimeInterval:(timerInterval - timerElapsed) target:self selector:@selector(fired) userInfo:nil repeats:NO];
timerStarted = [NSDate date];
}
-(void) fired {
[timer invalidate];
timer = nil;
timerElapsed = 0.0;
[self startTimer];
// react to timer event here
}
-(void) pauseTimer {
[timer invalidate];
timer = nil;
timerElapsed = [[NSDate date] timeIntervalSinceDate:timerStarted];
}
//=========new timer update method=============
-(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];
}
}
- (IBAction)pauseResumeTimer:(id)sender {
if (timerRunning == NO) {
timerRunning = YES;
[pauseTimerBtn setTitle:@"Resume" forState:UIControlStateNormal];
NSString *stringVal = [NSString stringWithFormat:@"%@",timeTxt.text];
stringVal = [stringVal stringByReplacingOccurrencesOfString:@":" withString:@"."];
float tempFloatVal = [stringVal floatValue];
int minuteValue = floorf(tempFloatVal);
float tempSecVal = [stringVal floatValue] - floorf(tempFloatVal);
int secondVal = tempSecVal*100;
minuteValue = minuteValue*60;
oldTimeValue = minuteValue + secondVal;
[timer invalidate];
timer = nil;
}
else
{
timerRunning = NO;
[pauseTimerBtn setTitle:@"Pause" forState:UIControlStateNormal];
startDate = [NSDate date];
timer = [NSTimer scheduledTimerWithTimeInterval:0.25 target:self selector:@selector(timer:) userInfo:nil repeats:YES];
}
}
- (void)runTimer:(NSTimer *)timer {
NSInteger secondsAtStart = (NSInteger)[[NSDate date] timeIntervalSinceDate:startDate];
secondsAtStart = secondsAtStart + oldTimeValue;
NSInteger seconds = secondsAtStart % 60;
NSInteger minutes = (secondsAtStart / 60) % 60;
NSInteger hours = secondsAtStart / (60 * 60);
NSString *result = nil;
result = [NSString stringWithFormat:@"%02ld:%02ld",(long)minutes,(long)seconds];
timeTxt.text = result;
}