2010-11-10 17 views
11

bonjour Je développe petit gameApp. Je dois mettre la minuterie en pause lorsque l'utilisateur passe à une autre vue [par exemple, affichage des paramètres]. lorsque l'utilisateur revient à cette vue, j'ai besoin de reprendre la minuterie.comment faire une pause et reprendre NSTimer dans l'iphone

quelqu'un peut-il résoudre ce problème ...

Merci à l'avance ...

Répondre

4

Vous ne pouvez pas mettre en pause une minuterie. Cependant, lorsque l'utilisateur passe à l'affichage des paramètres, vous pouvez enregistrer le fireDate de la minuterie ainsi que la date actuelle. Après cela, vous invalidez la minuterie et laissez l'utilisateur faire ses trucs. Une fois qu'il/elle revient au jeu, vous créez un nouvel objet de minuterie et définissez la date de l'incendie sur l'ancienne date de l'incendie plus l'heure à laquelle l'utilisateur se trouvait dans le menu (oldTime + currentTime).

+0

Merci, mais je suis nouveau sur iphone. Pouvez-vous me fournir un échantillon de démonstration afin que je puisse facilement le parcourir? –

+0

@JustSid, pouvez-vous fournir un exemple de code pour cela? Je sais que c'est un couple d'années, mais il est redondant pour moi de créer une nouvelle question à ce sujet. :) – Pangu

3

Vous ne pouvez pas mettre en pause un NSTimer. Vous pouvez cependant l'invalider et en créer un nouveau si nécessaire.

+0

Merci Mais je ne peux pas invalider parce que quand je vais à une autre vue et revient, alors il devrait commencer à partir d'où il s'arrête. –

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 ne vous donne pas la possibilité de mettre en pause. Cependant, avec quelques variables simples, vous pouvez créer l'effet vous-même:

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

Cela a fonctionné assez bien pour moi.

5

vous pouvez utiliser ce code pour mettre en œuvre une pause et de reprendre la fonctionnalité dans 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]; 
} 
} 

racontons dans .h NSDate startDate;

NSTimeInterval pauseTimeinterval; et dans viewdidload pausetimeInterval = 0.0; bonne chance

+1

bon travail 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

Est-ce que vous finissez par le découvrir? J'ai vu que vous avez dit que vous ne pouvez pas invalider votre minuterie quand vous allez dans une autre vue. Pouvez-vous expliquer ce que vous entendez par là? Les NSTimers ne peuvent pas être mis en pause, et les méthodes pour simuler les suspendre impliquent généralement leur invalidation. Vous pouvez ensuite simuler "sans interruption" en créant une nouvelle minuterie qui redémarre ensuite. Cela simulera une minuterie en pause et non suspendue.

Pour les personnes qui souhaiteraient une méthode potentiellement plus pratique, j'ai écrit une classe de contrôleurs qui peut gérer facilement les minuteurs de mise en pause et de pause. Vous pouvez le trouver ici: https://github.com/LianaChu/LCPausableTimer

Vous pouvez utiliser la classe de contrôleur que j'ai écrite pour créer de nouveaux temporisateurs, puis vous pouvez mettre en pause et rétablir la temporisation en appelant les méthodes "pauseTimer" et "unpauseTimer" sur la classe de contrôleur.

J'apprécierais grandement vos commentaires ou vos commentaires sur la façon dont vous les avez utilisés, les modifications que vous aimeriez voir ou les fonctionnalités que vous aimeriez que j'ajoute. N'hésitez pas à répondre avec vos commentaires ici, ou postez sur l'onglet des problèmes sur la page Github.