2010-11-10 19 views
11

hola Estoy desarrollando juegos pequeñosApp. Necesito detener el temporizador, cuando el usuario va a otra vista [decir vista de configuración]. cuando el usuario regrese a esa vista, necesito reanudar el temporizador.cómo pausar y reanudar NSTimer en iphone

nadie puede resolver este problema ...

Gracias por adelantado ...

Respuesta

4

No se puede pausar un temporizador. Sin embargo, cuando el usuario va a la vista de configuración, puede guardar el fireDate del temporizador y también la fecha actual. Después de esto, invalida el temporizador y deja que el usuario haga sus cosas. Una vez que vuelva al juego, creará un nuevo objeto de temporizador y establecerá la fecha de activación en la fecha de activación anterior más la hora en que el usuario estuvo en el menú (oldTime + currentTime).

+0

Gracias, pero soy nuevo en el iphone. ¿Me puede dar alguna muestra de demostración para que pueda pasar fácilmente por ella? –

+0

@JustSid, ¿es posible que proporciones un código de muestra para esto? ... Sé que tengo un par de años, pero es redundante para mí crear una nueva pregunta sobre esto. :) – Pangu

3

No se puede hacer una pausa en un NSTimer. Sin embargo, puede invalidarlo y crear uno nuevo cuando sea necesario.

+0

Gracias Pero no puedo invalidar porque cuando voy a otra vista y regresa, debe comenzar desde donde se detiene. –

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

NSTimer no le da la posibilidad de pausarlo. Sin embargo, con unas pocas variables simples, puede crear el efecto usted mismo:

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

Esto ha funcionado bastante bien para mí.

5

puede utilizar este código para implementar la pausa y reanudar la funcionalidad en 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]; 
} 
} 

declaran en el archivo .h NSDate startDate;

NSTimeInterval pauseTimeinterval; y en viewdidload pausetimeInterval = 0.0; buena suerte

+1

buen trabajo alok :) – MTahir

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

} 
0

acabaste averiguarlo? Vi que dijiste que no puedes invalidar tu temporizador cuando pasas a otra vista. ¿Puedes explicar a qué te refieres con eso? Los NSTimers no se pueden pausar, y los métodos para simular pausarlos generalmente implican invalidarlos. Luego puede simular "deshacer la pausa" creando un nuevo temporizador que luego se iniciará nuevamente. Esto simulará un temporizador que se pausará y no se pausará.

Para las personas que deseen un método potencialmente más conveniente, escribí una clase de controlador que puede manejar cómodamente los temporizadores de pausa y desempaquetado. Puede encontrarlo aquí: https://github.com/LianaChu/LCPausableTimer

Puede usar la clase de controlador que escribí para crear nuevos temporizadores, y luego puede pausar y reanudar los temporizadores llamando a los métodos "pauseTimer" y "unpauseTimer" en la clase de controlador.

Agradecería mucho cualquier comentario o comentario como la forma en que lo usó, qué cambios le gustaría ver, o las características que le gustaría que agregue. No dude en responder sus comentarios aquí o publicarlos en la pestaña de problemas en la página de Github.

Cuestiones relacionadas