как приостановить и возобновить NSTimer в iphone - PullRequest
12 голосов
/ 10 ноября 2010

привет Я занимаюсь разработкой небольшой игры App. Мне нужно приостановить таймер, когда пользователь переходит к другому виду [скажем, к настройкам]. когда пользователь возвращается к этому виду, мне нужно возобновить таймер.

Кто-нибудь может решить эту проблему ...

Заранее спасибо ...

Ответы [ 7 ]

8 голосов
/ 19 августа 2012

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

Для меня это хорошо работает.

5 голосов
/ 05 марта 2013

вы можете использовать этот код для реализации функций паузы и возобновления в NSTimer

//=========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];
}
}

объявить в файле .h NSDate startDate;

NSTimeInterval pauseTimeinterval;и в viewdidload pausetimeInterval = 0.0;удачи

5 голосов
/ 10 ноября 2010

Вы не можете приостановить таймер. Однако, когда пользователь переходит к представлению настроек, вы можете сохранить fireDate таймера, а также текущую дату. После этого вы аннулируете таймер и позволяете пользователю делать свои вещи. Как только он / она переключается обратно в игру, вы создаете новый объект таймера и устанавливаете дату пожара на старую дату пожара плюс время, в течение которого пользователь находился в меню (oldTime + currentTime).

3 голосов
/ 10 ноября 2010

Вы не можете приостановить NSTimer. Однако вы можете сделать его недействительным и при необходимости создать новый.

2 голосов
/ 26 июля 2012
on Start - 
startNewCapture = [NSDate date];

on Pause - 
captureSessionPauseDate = [NSDate date]; 
captureSessionTimeInterval = [captureSessionPauseDate timeIntervalSinceDate:startNewCapture];

on Resume - 
NSDate *dateNow = [NSDate date];
startNewCapture = [NSDate dateWithTimeInterval:-captureSessionTimeInterval sinceDate:dateNow];
0 голосов
/ 15 мая 2015

Вы в конечном итоге выяснили это? Я видел, что вы сказали, что вы не можете сделать недействительным свой таймер, когда переходите в другое представление. Можете ли вы объяснить, что вы подразумеваете под этим? NSTimers нельзя ставить на паузу, а методы имитации их приостановки обычно включают их аннулирование. Затем вы можете смоделировать «бездействие», создав новый таймер, который затем снова запустится. Это будет имитировать таймер, который был приостановлен и не приостановлен.

Для людей, которым нужен потенциально более удобный метод, я написал класс контроллера, который может удобно обрабатывать таймеры приостановки и приостановки. Вы можете найти его здесь: https://github.com/LianaChu/LCPausableTimer

Вы можете использовать класс контроллера, который я написал, для создания новых таймеров, а затем вы можете приостанавливать и отключать таймеры, вызывая методы "pauseTimer" и "unpauseTimer" в классе контроллера.

Буду очень признателен за любые комментарии или отзывы, такие как, как вы их использовали, какие изменения вы хотели бы видеть, или любые функции, которые вы хотели бы, чтобы я добавил. Пожалуйста, не стесняйтесь отвечать здесь со своими комментариями или размещать сообщения на вкладке вопросов на странице Github.

0 голосов
/ 13 марта 2014
- (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;

}
...