Countdown-timer mit NSTimer in "0:00" format
Recherchiere ich seit Tagen auf, wie Sie dies tun und niemand hat eine Antwort.
Ich bin erstellen einer app mit 5 Timer auf die gleiche Ansicht.
Ich brauche erstellen einen timer, der nach unten zählt von 15:00" (Minuten und Sekunden), und andere, die nach unten zählt von "2:58" (Minuten und Sekunden). Der 15-Minuten-timer soll sich nicht wiederholen, aber es sollte aufhören, alle anderen Timer bei erreichen von "00:00 Uhr." Die "2:58" timer sich wiederholen soll, bis die "15:00" oder "Spiel-Uhr" den Wert 0 erreicht. Jetzt habe ich verschrottet, fast alle von meinem code, und ich bin auf die "2:58" wiederholende timer " oder "rocketTimer."
Weiß jemand, wie dies zu tun?
EDIT 2:
Mein simulator läuft nicht einmal die app, da ich derzeit keine Ahnung, ob der timer tatsächlich funktioniert oder nicht, aber aus meiner früheren versuche, es nicht geklappt hat. Es nicht zeigen, bis in dem format, das ich will und es zählt von 2 (aus der letzten Zeit, es hat tatsächlich funktioniert). Das problem ist auch, dass ich bin nicht fließend in objective-C. ich kann schreiben pseudocode ganzen Tag, wie jeder andere auch, aber ich kann nicht was ich möchte in code, weil ich nicht vollständig verstehen, die NSTimer.
EDIT:
In meiner Ausgabe, ich bekomme diese Fehlermeldung "beenden, genannt nach dem werfen einer Instanz von 'NSException'"
und dieser Fehler?
Hier ist mein code:
#import <UIKit/UIKit.h>
@interface FirstViewController : UIViewController {
//Rocket Timer
int totalSeconds;
bool timerActive;
NSTimer *rocketTimer;
IBOutlet UILabel *rocketCount;
int newTotalSeconds;
int totalRocketSeconds;
int minutes;
int seconds;
}
- (IBAction)Start;
@end
und meine .m
#import "FirstViewController.h"
@implementation FirstViewController
- (NSString *)timeFormatted:(int)newTotalSeconds
{
int seconds = totalSeconds % 60;
int minutes = (totalSeconds / 60) % 60;
return [NSString stringWithFormat:@"%i:%02d"], minutes, seconds;
}
-(IBAction)Start {
newTotalSeconds = 178; //for 2:58
newTotalSeconds = newTotalSeconds-1;
rocketCount.text = [self timeFormatted:newTotalSeconds];
if(timerActive == NO){
timerActive = YES;
newTotalSeconds = 178;
[rocketTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerLoop) userInfo:nil repeats:YES];
}
else{
timerActive = NO;
[rocketTimer invalidate];
rocketTimer = nil;
}
}
-(void)timerLoop:(id)sender {
totalSeconds = totalSeconds-1;
rocketCount.text = [self timeFormatted:totalSeconds];
}
- (void)dealloc
{
[super dealloc];
[rocketTimer release];
}
- (void)didReceiveMemoryWarning
{
//Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
//Release any cached data, images, etc that aren't in use.
}
- (void)viewDidLoad
{
[super viewDidLoad];
//Do any additional setup after loading the view from its nib.
timerActive = NO;
}
- (void)viewDidUnload
{
[super viewDidUnload];
//Release any retained subviews of the main view.
//e.g. self.myOutlet = nil;
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
//Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
@end
- Was haben Sie erreicht noch und was nicht? Von dem, was ich hier zu sehen, sollte es update das label richtig. Tut es das? Oder ist das problem, das es sich nicht wiederholt?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es ein paar Probleme mit dem code!
Die schlechte Nachricht ist, dass keiner von Ihnen beziehen sich auf die Abstürzen, die Sie sehen.
Die erste und offensichtlichste problem
Eigentlich, dass Sie nie aufhören, Ihr countdown!
Nachdem Sie habe geplant den timer in
Start
IhretimerLoop:
-Methode wird aufgerufen, jede Sekunde. Aber Sie vergessen, zu überprüfen, obtotalSeconds
geworden ist negativ...Das zweite problem
-(NSString *)timeFormatted:(int)newTotalSeconds
wird nicht so funktionieren, wie Sie es erwarten! Tatsächlich, ich bin mir ziemlich verdammt sicher, dass Xcode gibt Ihnen eine compiler-Warnung, die besagt "Lokale Deklaration von 'newTotalSeconds' verbirgt Instanz-variable".Probieren Sie es aus: In
Start
, ersetzen Sie die ZeilerocketCount.text = [self timeFormatted:newTotalSeconds];
mit der LinierocketCount.text = [self timeFormatted:42];
und setzen Sie einen breakpoint nach.Das Dritte problem (die eigentlich ein paar Probleme an einem Ort)
Ihre
dealloc
ist schlicht falsch:In Erster Linie ist es nicht die beste Idee zu haben, keine Anrufe nach
[super dealloc]
. Zweite, "ur doin it wrong": unter Berücksichtigung IhrerStart
-Methode, Sie nicht über den timer, so dass Sie muss nichtrelease
es. Stattdessen wird, wenn der timer war noch gültig ist, müssten Sieinvalidate
es. Aber das wird nicht noch werden ein problem, denn solangerocketTimer
ist geplant, Ihre viewController nichtdealloc
ed (es sei denn, Sie haben ein Fehler im Speicher-management an anderer Stelle). Ich habe eine schriftliche ziemlich vollständiges Beispiel der Erklärung dieses Verhaltens in einem früheren Beitrag.So, was den Absturz verursachte?
Ehrlich:
Keine Ahnung!
Um herauszufinden, was genau schief gelaufen ist, versuchen Sie, einen Haltepunkt zu
-[NSException raise]
. Alternativ können Sie diemain
Funktion inmain.m
werden die folgenden:Dass wird Ihnen sagen, in welcher Methode Sie Ihr Programm tatsächlich abgestürzt.
Wo ist
rocketTimer
instanziiert? Sie scheinen zu haben, dass Links sehr wichtiges detail aus. Meine Vermutung ist, dassrocketTimer
ist nicht korrekt beibehalten, indem Sie Ihren code ein und verursacht Abstürze beim Zugriff auf das Objekt, nachdem es schon freigegeben.Ich würde vorschlagen, die die Synthese Ihrer Immobilie und dann mit dem built-in-Einstellung wird durch die Einstellung
self.rocketTimer
wenn Sie Sie initialisieren.FirstViewController.h
FirstViewController.m
[super dealloc]
Letzte in Ihrem dealloc.Start
-Methode.invalidate
heißt es.Wenn das problem ist, dass es nicht wiederholen, ich würde lassen Sie die timerLoop Methode prüfen Sie den Wert von " totalSeconds vor der Subtraktion. Wenn es 0 ist, lassen Sie es es zu 178 wieder.
Wenn das problem liegt woanders, bitte sagen Sie uns wo, und geben Sie uns ein wenig mehr Informationen, was das problem ist und was hast du bereits versucht, die nächste Zeit.