NSTimer暂停不起作用

我设置了三个按钮,包括startstoppause 。 并且给NSTimer控制计算。开始停止按钮工作正常给我开始和停止时间但pause按钮不给我准确的时间。实际上暂停时间..但是再次开始它添加暂停的定时和显示[ay。 supoose我在5秒开始暂停并等待5秒然后按开始…它应该显示5 …但显示10 ..

 -(void)start:(NSTimer *)timer { if(_timer==nil) { startDate =[NSDate date]; _timer=[NSTimer scheduledTimerWithTimeInterval:0.25 target:self selector:@selector(timer:) userInfo:nil repeats:YES]; } if(_timer!=nil) { float pauseTime = -1*[pauseStart timeIntervalSinceNow]; [_timer setFireDate:[previousFireDate initWithTimeInterval:pauseTime sinceDate:previousFireDate]]; } } -(void)timer:(NSTimer *)timer { NSInteger secondsSinceStart = (NSInteger)[[NSDate date] timeIntervalSinceDate:startDate]; NSInteger seconds = secondsSinceStart % 60; NSInteger minutes = (secondsSinceStart / 60) % 60; NSInteger hours = secondsSinceStart / (60 * 60); NSString *result = nil; if (hours > 0) { result = [NSString stringWithFormat:@"%02d:%02d:%02d", hours, minutes, seconds]; } else { result = [NSString stringWithFormat:@"%02d:%02d", minutes, seconds]; } label.text=result; NSLog(@"time interval -> %@",result); } -(void)stop { if(_timer!=nil) { endDate = [NSDate date]; NSLog(@"endate%@",endDate); NSTimeInterval interval = [endDate timeIntervalSinceDate:startDate]; NSLog(@"total time %f",interval); [_timer invalidate]; _timer = nil; startDate=nil; } } -(void)pause:(NSTimer *)timer { pauseStart = [NSDate dateWithTimeIntervalSinceNow:0]; previousFireDate = [_timer fireDate]; [_timer setFireDate:[NSDate distantFuture]]; } 

我在mac os上创建了这个应用程序 。 我认为你可以理解逻辑,甚至可以通过微小的改变来复制它……至于UILabel。

在.h

 @interface AppDelegate : NSObject  @property (assign) IBOutlet NSWindow *window; - (IBAction)start:(id)sender; - (IBAction)pause:(id)sender; - (IBAction)stop:(id)sender; @property (strong) IBOutlet NSTextField *label; @property (strong)NSDate *startDate; @property (strong)NSTimer *timer; @property (assign)BOOL isRunning; @property (assign)BOOL isPaused; @property(assign)NSInteger secondsSinceStart; @property(assign)NSInteger secondsPaused; @end 

在.m

 #import "AppDelegate.h" @implementation AppDelegate - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { self.label.stringValue=@"00:00:00"; self.isRunning=NO; self.isPaused=NO; self.secondsPaused=0; } -(void)timerDisplay{ if (self.isPaused) { self.secondsPaused++; return; } self.secondsSinceStart+=1; NSInteger seconds = self.secondsSinceStart % 60; NSInteger minutes = (self.secondsSinceStart / 60) % 60; NSInteger hours = self.secondsSinceStart / (60 * 60); NSString *result = nil; if (self.isRunning && !self.isPaused) { result = [NSString stringWithFormat:@"%02ld:%02ld:%02ld", hours, minutes, seconds]; self.label.stringValue=result; } } - (IBAction)start:(id)sender { self.isRunning=!self.isRunning; self.isPaused=NO; self.secondsSinceStart=0; self.label.stringValue=@"00:00:00"; self.startDate =[NSDate date]; if (!self.timer) { self.timer=[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerDisplay) userInfo:nil repeats:YES]; } } - (IBAction)pause:(id)sender { self.isPaused=!self.isPaused; NSLog(@"pause : %d",self.isPaused); } - (IBAction)stop:(id)sender { self.isRunning=NO; NSLog(@"start : %@",self.startDate); NSLog(@"end : %@",[NSDate date]); NSLog(@"paused : %ld",self.secondsPaused); NSInteger totalTime=self.secondsSinceStart+self.secondsPaused; NSInteger seconds = totalTime % 60; NSInteger minutes = (totalTime / 60) % 60; NSInteger hours = totalTime / (60 * 60); NSString *result = result = [NSString stringWithFormat:@"%02ld:%02ld:%02ld", hours, minutes, seconds]; NSLog(@"Total : %@",result); } @end 

它将永远不会为你工作,因为NSTimer不能暂停,它将启动它只会停止当你将它无效。 当它处于有效状态时,表示它正在运行,当状态无效时,表示Timer已停止。 谢谢