2012-03-29 8 views
0

Wenn ich auf Start klicken Sie auf die stopWatchLabel zeigt folgende (seine statische, nothings läuft):NSTimer nicht nur auf Stoppuhr App arbeitet an SIMULATOR (Zeigt statische seltsame Zahl)

  • HINWEIS: Wenn ich diese App testen auf Mein iPhone läuft alles wie erwartet. Überhaupt keine Probleme.

Kann jemand erklären warum?

enter image description here

.h

#import <UIKit/UIKit.h> 

@interface ViewController : UIViewController 
{ 
    NSTimer *stopWatchTimer; 
    NSDate *startDate; 
} 


@property (strong, nonatomic) IBOutlet UILabel *stopWatchLabel; 

- (IBAction)startButtonTapped:(id)sender; 

- (IBAction)stopButtonTapped:(id)sender; 

-(void)updateTimer; 

@end 

.m

- (IBAction)startButtonTapped:(id)sender { 

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


- (void)updateTimer 
{ 
    NSDate *currentDate = [NSDate date]; 
    NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:startDate]; 
    NSDate *timerDate = [NSDate dateWithTimeIntervalSince1970:timeInterval]; 

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat:@"HH:mm"]; 
    [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]]; 

    NSString *timeString=[dateFormatter stringFromDate:timerDate]; 
    stopWatchLabel.text = timeString; 
} 


- (IBAction)stopButtonTapped:(id)sender { 

    [stopWatchTimer invalidate]; 
} 
+1

See [hier] (http://stackoverflow.com/questions/1189252/how-to-convert-an-nstimeinterval-seconds-into-minutes) für das Erhalten der Stunden und Minuten direkt von der 'NSTimeInterval '. Sie müssen kein neues Datum erstellen und es nicht formatieren. – Joe

+0

Danke für den Hinweis. –

Antwort

0

Sie nicht setzen startDate

Ihr Code sollte wie folgt aussehen (ich nehme an, dies ist ARC) :

- (IBAction)startButtonTapped:(id)sender { 
    startDate = [NSDate date]; 

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

und der updateTimer ist eine lächerlich komplizierte Methode, Sekunden in Minuten und Sekunden zu teilen. Mach ein paar grundlegende Mathe.

- (void)updateTimer 
{ 
    NSDate *currentDate = [NSDate date]; 
    NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:startDate]; 

    NSInteger minutes = floor(timeInterval/60); 
    NSInteger seconds = trunc(timeInterval - minutes * 60); 

    NSString *timeString=[NSString stringWithFormat:@"%i:%02i", minutes, seconds]; 
    stopWatchLabel.text = timeString; 
} 

EDIT: Eigentlich sollten Sie die eingebaute verwenden NSCalendar/NSDateComponents API, weil es kein Tageslicht wie die Methode grundlegende mathematische Speichern nicht ignorieren.

- (void)updateTimer 
{ 
    NSDate *currentDate = [NSDate date]; 
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
    NSDateComponents *components = [calendar components:NSSecondCalendarUnit|NSMinuteCalendarUnit fromDate:startDate toDate:currentDate options:0]; 
    NSInteger minutes = [components minute]; 
    NSInteger seconds = [components second]; 

    NSString *timeString=[NSString stringWithFormat:@"%i:%02i", minutes, seconds]; 
    stopWatchLabel.text = timeString; 
} 
+0

Danke Matthias. Schätzen Sie Ihre Hilfe wieder. –

+0

Noch besser, danke. –