Вопрос

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

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

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

Это было полезно?

Решение

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

Другие советы

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

Это работает довольно хорошо для меня.

Вы можете использовать этот код для реализации паузы и возобновления функциональности в 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; удачи

Вы не можете приостановить Nstimer. Вы можете, однако, однако, неиндивенны и создаете новый при необходимости.

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

}

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

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

Вы можете использовать класс контроллера, который я написал для создания новых таймеров, а затем вы можете приостановить и опровергать таймеры по вызове методов «PausEtimer» и «USAUSETIMER» на классе контроллера.

Я бы очень признателен за любые комментарии или отзывы, например, как вы использовали его, какие изменения вы хотели бы видеть, или любые функции, которые вы хотели бы добавить. Пожалуйста, не стесняйтесь отвечать с вашими комментариями здесь, или опубликовать вкладку «Вопросы» на странице GitHub.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top