2010-11-10 8 views
11

cześć Zajmuję się rozwojem małych gameApp. Muszę wstrzymać stoper, gdy użytkownik przejdzie do innego widoku [zobacz widok ustawień]. , gdy użytkownik wróci do tego widoku, muszę wznowić licznik czasu.jak zatrzymać i wznowić NSTimer w iphone

ktoś może rozwiązać ten problem ...

z góry dzięki ...

Odpowiedz

4

Nie można zatrzymać zegara. Jednakże, gdy użytkownik przejdzie do widoku ustawień, można zapisać fireDate licznika czasu oraz bieżącą datę. Po tym unieważnieniu licznika czasu i pozwolić użytkownikowi zrobić swoje rzeczy. Po powrocie do gry utworzysz nowy obiekt timera i ustawisz datę pożaru na dawną datę wybuchu plus czas, w którym użytkownik był w menu (oldTime + currentTime).

+0

Dzięki, ale jestem nowy w telefonie iPhone. czy możesz podać mi próbkę demo, dzięki czemu mogę z łatwością ją przejrzeć. –

+0

@JustSid, czy możesz podać przykładowy kod dla tego? .. Wiem, że to jest kilka lat, ale zbędne jest dla mnie stworzenie nowego pytania na ten temat. :) – Pangu

3

Nie można wstrzymać NSTimer. Możesz jednak je unieważnić i utworzyć nowe, gdy zajdzie taka potrzeba.

+0

Dzięki Ale nie mogę unieważnić, ponieważ kiedy przejdę do innego widoku i wróci to powinien zacząć od miejsca, w którym się zatrzymuje. –

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 nie daje możliwości wstrzymania go. Jednak z kilkoma prostymi zmiennymi, możesz sam stworzyć efekt:

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

To bardzo dobrze mi wychodziło.

5

można użyć tego kodu do wdrożenia wstrzymać i wznowić działanie w 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]; 
} 
} 

zadeklarować w pliku .h NSDate startDate;

NSTimeInterval pauseTimeinterval; oraz w viewdidload pausetimeInterval = 0.0; Powodzenia

+1

Dobra robota 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

Czy skończyć zastanawianie go? Zobaczyłem, że powiedziałeś, że nie możesz unieważnić licznika, kiedy przejdziesz do innego widoku. Czy możesz wyjaśnić, co przez to rozumiesz? NSTimerów nie można wstrzymać, a metody symulacji wstrzymywania zwykle wiążą się z ich unieważnieniem. Następnie można symulować "unpausing", tworząc nowy timer, który następnie uruchomi się ponownie. Spowoduje to symulację zatrzymania i zatrzymania timera.

Dla osób, które chciałyby mieć potencjalnie bardziej dogodną metodę, napisałem klasę kontrolera, która może wygodnie obsługiwać wstrzymywanie i nieużywanie liczników czasu. Możesz go znaleźć tutaj: https://github.com/LianaChu/LCPausableTimer

Możesz użyć napisanej przeze mnie klasy kontrolera do tworzenia nowych timerów, a następnie możesz wstrzymywać i wznawiać zegary, wywołując metody "pauseTimer" i "unpauseTimer" na klasie kontrolera.

Będę bardzo wdzięczny za wszelkie uwagi lub opinie, takie jak sposób, w jaki go używałeś, jakie zmiany chciałbyś zobaczyć lub jakie funkcje chciałbyś dodać. Nie wahaj się odpowiedzieć na swoje komentarze tutaj lub opublikuj na karcie problemów na stronie Github.