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

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.

War es hilfreich?

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];
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top