在Objective-C中实现倒数计时器?

我是iOS编程新手。 我正在研究匹配游戏的单词。 在这个游戏中,我需要实现时间计数器,显示分钟和秒。 我希望当我的比赛开始时我的计时器开始3分钟。 现在我想用秒来反向减less这个定时器。 我的代码只是数秒钟..这里是我的代码:

secondsLeft--; int seconds = (secondsLeft %3600) % 60; Timerlbl.text = [NSString stringWithFormat:@"%02d",seconds]; if (seconds==0) { UIAlertView *pAlert = [[UIAlertView alloc]initWithTitle:@"Sorry!!" message:@"TimeOver" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:@"Cancel",nil]; [pAlert show]; [pAlert release]; } } 

在Viewdidload中,我通过计时器来调用它。

  countDown=[NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(TimeOver) userInfo:nil repeats:YES]; 

请任何人指导我如何在两分钟内做到这一点。

你可以这样做(ARC启用): –

 @interface ViewController() { UILabel *progress; NSTimer *timer; int currMinute; int currSeconds; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; progress=[[UILabel alloc] initWithFrame:CGRectMake(80, 15, 100, 50)]; progress.textColor=[UIColor redColor]; [progress setText:@"Time : 3:00"]; progress.backgroundColor=[UIColor clearColor]; [self.view addSubview:progress]; currMinute=3; currSeconds=00; // Do any additional setup after loading the view, typically from a nib. } -(void)start { timer=[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerFired) userInfo:nil repeats:YES]; } -(void)timerFired { if((currMinute>0 || currSeconds>=0) && currMinute>=0) { if(currSeconds==0) { currMinute-=1; currSeconds=59; } else if(currSeconds>0) { currSeconds-=1; } if(currMinute>-1) [progress setText:[NSString stringWithFormat:@"%@%d%@%02d",@"Time : ",currMinute,@":",currSeconds]]; } else { [timer invalidate]; } } 

我知道这是一个老问题,但我想分享我的方式来实现这一点。 我们有方法(timeIntervalSinceDate :)来计算间隔,并有固定的秒数倒计时。 在我的情况下300秒。

更新2015年7月SWIFT

 @IBAction func startTimer(sender: UIButton) { sender.selected = !sender.selected; //if selected fire timer, otherwise stop if (sender.selected) { self.timer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: Selector("updateTimer"), userInfo: nil, repeats: true); self.startDate = NSDate(); } else { self.stopTimer(); } } func stopTimer() { self.timer.invalidate(); } func updateTimer() { // Create date from the elapsed time var currentDate:NSDate = NSDate(); var timeInterval:NSTimeInterval = currentDate.timeIntervalSinceDate(self.startDate!); //300 seconds count down var timeIntervalCountDown = 300 - timeInterval; var timerDate:NSDate = NSDate(timeIntervalSince1970: timeIntervalCountDown); // Create a date formatter var dateFormatter = NSDateFormatter(); dateFormatter.dateFormat = "mm:ss"; dateFormatter.timeZone = NSTimeZone(forSecondsFromGMT: 0); // Format the elapsed time and set it to the label var timeString = dateFormatter.stringFromDate(timerDate); self.timerLabel?.text = timeString; } 

工作github swift示例项目

Objective-C的

 - (void)updateTimer { // Create date from the elapsed time NSDate *currentDate = [NSDate date]; NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:self.startDate]; NSLog(@"time interval %f",timeInterval); //300 seconds count down NSTimeInterval timeIntervalCountDown = 300 - timeInterval; NSDate *timerDate = [NSDate dateWithTimeIntervalSince1970:timeIntervalCountDown]; // Create a date formatter NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"mm:ss"]; [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]]; // Format the elapsed time and set it to the label NSString *timeString = [dateFormatter stringFromDate:timerDate]; self.stopWatch.text = timeString; } - (void)stopTimer { [self.stopWatchTimer invalidate]; self.stopWatchTimer = nil; [self updateTimer]; } - (void)startTimer { if (self.stopWatchTimer) { [self.stopWatchTimer invalidate]; self.stopWatchTimer = nil; } self.startDate = [NSDate date]; // Create the stop watch timer that fires every 100 ms self.stopWatchTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/10.0 target:self selector:@selector(updateTimer) userInfo:nil repeats:YES]; } 

更新:

每次通过updateTimer时创build一个NSDateFormatter是非常昂贵的。 最好在循环之外创buildNSDateFormatter并重用它。 积分:@siburb

在.h文件中

  IBOutlet UILabel* lblTimer; NSTimer* gameTimer; 

在.m文件中

 -(void)viewDidLoad { [super viewDidLoad]; [self createTimer]; } - (void)createTimer { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSRunLoop* runLoop = [NSRunLoop currentRunLoop]; gameTimer = [[NSTimer timerWithTimeInterval:1.00 target:self selector:@selector(timerFired:) userInfo:nil repeats:YES] retain]; [[NSRunLoop currentRunLoop] addTimer:gameTimer forMode:NSDefaultRunLoopMode]; timeCount = 20; [runLoop run]; [pool release]; } - (void)timerFired:(NSTimer *)timer { if(timeCount == 0) { [self timerExpired]; } else { timeCount--; if(timeCount == 0) { [timer invalidate]; [self timerExpired]; } } lblTimer.text = [NSString stringWithFormat:@"%02d:%02d",timeCount/60, timeCount % 60]; self.title = lblTimer.text; } 

将以上标签出口与标签在视图中绑定。

它正在与我正确地工作

你可以使用NSTimer来实现这一点。