2013-03-09 3 views
6

Ich versuche, einen einfachen Countdown-Timer zu erstellen, so dass wenn ein Spieler mein Spiel betritt der Timer von 60 bis 0 beginnt. Es scheint einfach, aber ich bin verwirrt, wie ich dies schreibe.(NSTimer) Erstellen eines Timer-Countdowns

Bisher habe ich eine Methode in meinem GameController.m geschaffen, die wie folgt aussieht:

-(int)countDownTimer:(NSTimer *)timer { 
    [NSTimer scheduledTimerWithTimeInterval:-1 
           invocation:NULL 
            repeats:YES]; 
    reduceCountdown = -1; 
    int countdown = [[timer userInfo] reduceCountdown]; 
    if (countdown <= 0) { 
     [timer invalidate]; 
    } 
    return time; 
} 

Zu Beginn des Spiels ich die ganze Zahl Zeit bei 60 initialisieren Das Etikett dann innerhalb von Viewcontroller festgelegt wird . Aber in dem Moment, in dem ich den Code kompiliere, zeigt er nur die Markierung bei 60 und dekrementiert überhaupt nicht.

Jede Hilfe würde sehr geschätzt werden - ich bin neu in Objective-C.


EDIT

Mit etwas Hilfe von ich jetzt den Code in 2 separate Verfahren getrennt haben. Der Code sieht nun wie folgt aus:

-(void)countDown:(NSTimer *)timer { 
    if (--time == 0) { 
     [timer invalidate]; 
     NSLog(@"It's working!!!"); 
    } 
} 

-(void)countDownTimer:(NSTimer *)timer { 
    NSLog(@"Hello"); 
    [NSTimer scheduledTimerWithTimeInterval:1 
             target:self 
          selector:@selector(countDown:) 
             userInfo:nil 
             repeats:YES]; 
} 

JEDOCH, wird der Code immer noch nicht ordnungsgemäß ausgeführt und wenn ich die Methode aufrufen [Spiel countDownTimer] von meinem View Controller bricht den Worten: „Unbekannter Selektor an Instanz gesendet“ . Kann mir jemand erklären, was hier falsch ist?

Antwort

11

Mehrere Dinge sind falsch mit Ihrem Code:

  • Sie einen falschen Parameter für das Zeitintervall vorbei - negative Zahlen werden als die 0,1 ms interpretiert
  • Sie rufen die falsche Überladung auf - es wird erwartet, dass Sie ein Aufrufobjekt übergeben, aber Sie übergeben eine NULL
  • Sie setzen den Code, den Sie auf dem Timer ausführen möchten, zusammen mit der Timer-Initialisierung - der Code, der am Timer ausgeführt werden soll, sollte in eine separate Methode gehen.

Sie sollten die Überlastung aufrufen, die einen Selektor nimmt, und 1 für das Intervall passieren, anstatt -1.

Declare NSTimer *timer und int remainingCounts, dann fügen Sie

timer = [NSTimer scheduledTimerWithTimeInterval:1 
             target:self 
             selector:@selector(countDown) 
             userInfo:nil 
             repeats:YES]; 
remainingCounts = 60; 

an den Ort, wo Sie den Countdown starten möchten.Dann fügen Sie den Count-down-Methode selbst:

-(void)countDown { 
    if (--remainingCounts == 0) { 
     [timer invalidate]; 
    } 
} 
+0

würde es nicht noch einmal schießen, als er auf diese Weise will? Ich denke, es sollte "--remainingCounts == 0", nein? –

+0

@ Daij-Djan Sie haben recht, es sollte entweder 'restorescounts = 59' oder' --remainingCounts' sein. Vielen Dank! – dasblinkenlight

+0

Vielen Dank für Ihr Feedback dasblinkenlight. Aber immer noch kämpfen, um es zum Laufen zu bringen! Momentan kommuniziert mein Selektor nicht mit der countDown-Methode, d. H. Wenn ich den Code kompiliere, passiert nichts. Könnte das sein, weil der Timer nicht gestartet wurde oder dass sie nicht verbunden sind? –

0

Aus der Frage, die Sie gestellt haben, können Sie das erreichen, indem Sie für jede 1 Sekunde eine Funktion aufrufen und die Dekrementierungslogik damit behandeln.

Snippet: -

NSTimer *t = [NSTimer scheduledTimerWithTimeInterval: 1.0 
         target: self 
         selector:@selector(onTick:) 
         userInfo: nil repeats:YES]; 
(void)onTick 
{ 
    //do what ever you want 
    NSLog(@"i am called for every 1 sec"); 
//invalidate after 60 sec [timer invalidate]; 
} 
+0

schreibe ich den onTick Verfahren innerhalb der gleichen Methode wie die CountdownTimer? –

+0

Sie können die CountdownTimer-Methode selbst anstelle von onTick verwenden, um Sie zu verwirren, indem Sie einen anderen Methodennamen schreiben. –

1

Versuchen Sie, diese

- (void)startCountdown 
{ 
    _counter = 60; 

    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1 
                 target:self 
                selector:@selector(countdownTimer:) 
                userInfo:nil 
                repeats:YES]; 
} 

- (void)countdownTimer:(NSTimer *)timer 
{ 
    _counter--; 
    if (_counter <= 0) { 
     [timer invalidate]; 
     // Here the counter is 0 and you can take call another method to take action 
     [self handleCountdownFinished]; 
    } 
} 
+0

Vielen Dank für Ihre Antwort - Wie kommt es, dass Sie Unterstriche vor Ihrer Ganzzahl verwendet haben? Warum muss ich das tun? –

+0

Ich machte Counter eine Eigenschaft und mit Auto-synthetisierten Eigenschaften Xcode verwendet einen Unterstrich. – bbarnhart

+0

es sagt immer "Verwendung von nicht deklarierten Bezeichner" _counter, wie kann ich das lösen? –