2013-08-13 12 views
5

Mam grę, która korzysta z licznika czasu. Chcę to zrobić, aby użytkownik mógł wybrać przycisk i wstrzyma ten timer, a kiedy ponownie klikną ten przycisk, wznowi działanie tego zegara. Mam już kod do timera, potrzebuję tylko pomocy przy zatrzymywaniu timera i przycisku podwójnej akcji.Jak zatrzymać NSTimer?

Kod do timera:

-(void)timerDelay { 

    mainInt = 36; 

    timer = [NSTimer scheduledTimerWithTimeInterval:1.0 
             target:self 
             selector:@selector(countDownDuration) 
             userInfo:nil 
             repeats:YES]; 
} 

-(void)countDownDuration { 

    MainInt -= 1; 

    seconds.text = [NSString stringWithFormat:@"%i", MainInt]; 
    if (MainInt <= 0) { 
     [timer invalidate]; 
     [self delay]; 
    } 

} 
+0

Oznaczenie odpowiedzi TBlue jako prawidłowe było poprawne, jeśli pomogło. Nie musisz edytować tego kodu na swoje pytanie lub dodać [SOLVED] do tytułu. Zalecam przeczytanie [pomocy], aby dowiedzieć się więcej o właściwych sposobach publikowania w StackOverflow. – madth3

Odpowiedz

16

To bardzo proste.

// Declare the following variables 
BOOL ispaused; 
NSTimer *timer; 
int MainInt; 

-(void)countUp { 
    if (ispaused == NO) { 
     MainInt +=1; 
     secondField.stringValue = [NSString stringWithFormat:@"%i",MainInt]; 
    } 
} 

- (IBAction)start1Clicked:(id)sender { 
    MainInt=0; 
    timer=[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(countUp) userInfo:Nil repeats:YES]; 
} 

- (IBAction)pause1Clicked:(id)sender { 
    ispaused = YES; 
} 

- (IBAction)resume1Clicked:(id)sender { 
    ispaused = NO; 
} 
5

Nie ma pauza i wznowienie funkcji w NSTimer. Możesz implikować to jak poniższy kod.

- (void)startTimer 
{ 
    m_pTimerObject = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(fireTimer:) userInfo:nil repeats:YES]; 
} 

- (void)fireTimer:(NSTimer *)inTimer 
{ 
    // Timer is fired. 
} 

- (void)resumeTimer 
{ 
    if(m_pTimerObject) 
    { 
     [m_pTimerObject invalidate]; 
     m_pTimerObject = nil;   
    } 
    m_pTimerObject = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(fireTimer:) userInfo:nil repeats:YES]; 
} 

- (void)pauseTimer 
{ 
    [m_pTimerObject invalidate]; 
    m_pTimerObject = nil; 
} 
+5

To nie zatrzymuje się, tylko zatrzymuje się i uruchamia ponownie. –

+0

@CarlVeazey Jak wspomniano w odpowiedzi, nie ma funkcji "pauzy" w 'NSTimer', więc każda odpowiedź (w tym zaakceptowana) musi obejść ten fakt. Ta odpowiedź jest lepsza niż zaakceptowana, ponieważ nie utrzymuje zegara, który nie wykonuje żadnego cennego działania. +1 –

+0

@Nate odpowiedzi w duplikacie wydają się obejść ten fakt, nadal oferując funkcjonalność pauzy. Nie sądzę, żeby to nierozsądne. –