NSTimer暂停不起作用

时间:2012-12-31 12:55:15

标签: iphone ios nsdate nstimer

我设置了三个按钮startstoppause。并且给NSTimer控制计算。开始停止按钮工作正常给我开始和停止时间但是pause按钮没有给我准确的时间。实际上暂停时间..但是再次开始它添加了暂停的定时和显示[好哦。 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]];
}

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

在.h

@interface AppDelegate : NSObject <NSApplicationDelegate>

@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