Реализация таймера обратного отсчета в Objective-c?

Я новичок в программировании iOS. Я работаю над игрой слов соответствия. В этой игре мне нужно реализовать счетчик времени, который показывает минуты и секунды. Я хочу, чтобы при запуске моей игры мой таймер начинался с 3 минут. Теперь я хочу уменьшить этот таймер в обратном направлении с секундами. мой код просто работает в течение нескольких секунд .. вот мой код:

  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];

Просьба любой направляет меня, как я могу сделать это как за минуты, так и за секунды.

 NIKHIL19 мая 2012 г., 11:09
Пожалуйста, проверьте следующую ссылкуCount down timer Это также довольно удобно. С уважением, Нил

Ответы на вопрос(4)

что это старый вопрос, но я хочу поделиться своим путем для достижения этого. У нас есть метод (timeIntervalSinceDate :) для вычисления интервала и фиксированное количество секунд для обратного отсчета. В моем случае 300 с.

UPDATE JULY, 2015 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];
}

UPDATE:

создавать NSDateFormatter каждый раз, когда вы проходите через updateTimer, очень дорого. Гораздо лучше создать NSDateFormatter вне цикла и использовать его повторно. Кредиты: @siburb

 14 дек. 2016 г., 09:18
@siburb, честно, добавлю ваш комментарий в обновление
 01 нояб. 2013 г., 13:46
Спасибо за это! Это действительно хорошо.
 14 дек. 2016 г., 08:39
В случае, если кто-то собирается скопировать / вставить этот дословно (вы знаете, кто вы есть), это очень дорого, чтобы создатьNSDateFormatter каждый раз, когда вы проходитеupdateTimer, Куда лучше создатьNSDateFormatter вне цикла и использовать его повторно.

In .h file

 

In .m file

-(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;
}

Свяжите вышеприведенную розетку с меткой в поле зрения.

Со мной правильно работает

 22 мар. 2014 г., 16:29
 19 мая 2012 г., 10:29
NSRunLoop повесит элемент управления, если он направлен на событие, вызванное действием определенного элемента управления UIView.
Решение Вопроса

@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];
    }
}
 08 июл. 2016 г., 13:09
Спасибо, приятель, я хочу точно сказать, что ты написал большое спасибо ...
 jamil19 мая 2012 г., 13:06
Спасибо Уважаемый @roronoa zorro Ваш ответ является лучшим решением, которое я хочу.
 14 мая 2013 г., 07:35
Привет @ roronoa-zorro, было интересно, как бороться с приостановкой таймера?
 05 сент. 2013 г., 20:19
Слегка педантичный комментарий:NSTimer сохраняет свою цель, поэтому этот код будет вызыватьViewController не должен быть освобожден, если его таймер не достиг нуля. Существует множество обходных путей, в основном использующих прокси-объекты и слабые ссылки, и это даже не обязательно действительно имеет значение & # x2014; довольно часто у вас есть контроллеры представления, которые, как вы знаете, никогда не будут освобождены (как правило, корневой контроллер представления).
 21 мая 2013 г., 16:50
Вы не можете приостановить или перезапустить таймер, вы можете только сделать его недействительным. Пауза & amp; Резюме может быть воспроизведено с помощью переменной NSDate, сохраните текущую дату NSDate в тот момент, когда вы хотите приостановить (фактически аннулировать) & amp; перезапустите таймер из сохраненного объекта NSDate
Решение Вопроса

NSTimer для достижения этой цели.

 19 мая 2012 г., 10:27
Проверьте это, может быть, это вызывает проблемы для вас -stackoverflow.com/questions/2340930/stray-342-in-c-program
 jamil19 мая 2012 г., 10:40
Спасибо, теперь его работа в порядке. Уважаемый @rishi, большое спасибо за помощь. Теперь я рад принять Твой ответ, спасибо.
 08 февр. 2019 г., 13:57
Я не понимаю ваш ответ и эти ссылки. Это имеет отношение к вопросу?
 19 мая 2012 г., 09:55
Посмотрите этот урок, он поможет вам достичь того, чего вы хотите -pravinmagdum.wordpress.com/tag/nstimer-tutorial

Ваш ответ на вопрос