Einen NSTimer für MM:SS:HS verwenden?
-
12-12-2019 - |
Frage
Ich habe in Xcode 4.2 einen NSTimer erstellt und er funktioniert, aber ich bekomme dieses eine Problem.
Hier ist mein Projekt im Simulator
Wenn ich Start drücke, startet es und wenn ich Stopp drücke, stoppt es und wenn es gestoppt wird, wird es zurückgesetzt, aber wenn es startet und ich zurücksetze, wenn es nichts passiert, wird es nicht zurückgesetzt, wenn Sie im Grunde gestartet werden, dann müssen Sie zurücksetzen. Wege und dies oder muss ich einen Code hinzufügen, wo hier eine Kopie meines Codes besteht.
#import <UIKit/UIKit.h>
@interface FirstViewController : UIViewController {
IBOutlet UILabel *time;
NSTimer *myticker;
//declare baseDate
NSDate* baseDate;
}
-(IBAction)stop;
-(IBAction)reset;
@end
Hier ist meine Implementierung
#import "FirstViewController.h"
@implementation FirstViewController
@synthesize baseDate;
-(IBAction)start {
[myticker invalidate];
self.baseDate = [NSDate date];
myticker = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(showActivity) userInfo:nil repeats:YES];
}
-(IBAction)stop;{
[myticker invalidate];
myticker = nil;
}
-(IBAction)reset {
self.baseDate = [NSDate date];
time.text = @"00:00:0";
}
-(void)showActivity {
NSTimeInterval interval = [baseDate timeIntervalSinceNow];
double intpart;
double fractional = modf(interval, &intpart);
NSUInteger hundredth = ABS((int)(fractional*10));
NSUInteger seconds = ABS((int)interval);
NSUInteger minutes = seconds/60;
time.text = [NSString stringWithFormat:@"%02d:%02d:%01d", minutes%60, seconds%60, hundredth];
}
Ich weiß es wirklich zu schätzen.Danke.
Lösung
Erstens sollte das Obige mit EXC_BAD_ACCESS abstürzen, wenn es erreicht wird showActivity
seit baseDate
wird nicht im gespeichert start
Methode. [NSDate date]
gibt ein automatisch freigegebenes Objekt zurück baseDate
wird nach dem eine ungültige Referenz haben start
Methode.
Ich schlage vor, zu wechseln baseDate
zu einem retain
Eigentum und setzen es dann ein start
verwenden self.
:
//.h
@property (nonatomic, retain) NSDate *baseDate;
//.m
@synthesize baseDate;
-(IBAction)start {
[myticker invalidate];
self.baseDate = [NSDate date];
myticker = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(showActivity) userInfo:nil repeats:YES];
}
Um das zu beheben reset
Problem, beachten Sie, dass die showActivity
Methode nimmt den aktuellen Wert von an baseDate
um die verstrichene Zeit zu berechnen und stellt dann die ein time
Etikett, um es formatiert anzuzeigen.
Im start
Methode legen Sie die fest baseDate
auf die aktuelle Uhrzeit (die Sie nicht festlegen). time.text
) und starten Sie dann den Timer.Der showActivity
Die Methode wird dann weiter ausgelöst und eingestellt time.text
.
Im reset
Mit dieser Methode möchten Sie, dass der Timer die verstrichene Zeit seit dem Drücken von „Reset“ anzeigt.Der Timer läuft bereits, sodass Sie ihn nicht erneut starten müssen.Einstellen der time
Beschriftungstext funktioniert nicht, da der bereits laufende Timer erneut die verstrichene Zeit berechnet baseDate
Das ist immer noch die ursprüngliche Startzeit und wird dann eingestellt time.text
darauf bezogen.Also statt einstellen time.text
, stellen Sie die ein baseDate
:
-(IBAction)reset {
self.baseDate = [NSDate date];
}