2016-09-15 1 views
0

Ich habe seit 2 Tagen versucht, hoch und niedrig zu suchen und kann nicht die Millisekunden zum Arbeiten bekommen. Die Stunden, Minuten & Sekunden funktionieren gut, aber Millisekunden nicht.TimePicker Countdown in Millisekunden

Ich habe einen lapCounter gemacht, der UP zählt und keine Probleme mit den Millisekunden hat.

Hier ist der Arbeitscode für die Lapcounter, die UP zählt und die Millisekunden arbeiten:

int hours = (UInt8)(elapsedTime /(60*60)); 
    int mins = (UInt8)(elapsedTime/60.0); 
    elapsedTime -= (mins * 60); 
    int secs = (UInt8)(elapsedTime); 
    elapsedTime -= (secs); 
    int mms = (UInt8)(elapsedTime * 100); 

Aber ich kann nicht die Timepicker Rückwärtszählsignalen machen, Arbeit.

Dies ist, was ich für die Timepicker Rückwärtszählsignalen haben:

int afterRemainder; 
int remainder; 
NSTimeInterval countDownTime; 
NSTimer *countDownTimer; 
bool startCountDown; 

- (IBAction)startCountDownButton:(id)sender { 
    if (startCountDown == false) { 
     countDownTime = (NSTimeInterval)_datePicker.countDownDuration; 
     remainder = countDownTime; 
     afterRemainder = countDownTime - remainder%60; 

     countDownTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateCountDown) userInfo:nil repeats:YES]; 

     startCountDown = true; 
} 

-(void)updateCountDown { 
    afterRemainder --; 

    int hours = (int)(afterRemainder/(60 * 60)); 
    int mins = (int)(afterRemainder/60) - (60 * hours); 
    int secs = (int)(afterRemainder - (60 * mins) - (60 * hours * 60)); 
    int mms = (int)(afterRemainder - (3600 * secs) - (mins * 60)); 
    self.displayCountDown.text = [[NSString alloc] initWithFormat:@"%02d", hours]; 
    self.displayCountDownMins.text = [[NSString alloc] initWithFormat:@": %02d", mins]; 
    self.displayCountDownSecs.text = [[NSString alloc] initWithFormat:@"%02d", secs]; 
    self.displayCountDownMMs.text = [[NSString alloc] initWithFormat:@":%2d", mms]; 
} 
+0

definieren "nicht funktioniert". Was genau ist das Problem? Geben Sie in Ihrer Frage klare Beispiele (nicht in Kommentaren). – rmaddy

+0

@rmaddy Hallo vielen Dank für das Posten. Die Millisekunden zählen nicht in Millisekunden. Einige verrückte Zahlen kommen auf und ich habe alles versucht. –

+0

@rmaddy es ist die Mathematik in den Millisekunden, die fehlschlägt. –

Antwort

0

Try this:

@interface ViewController() 

@property (nonatomic, weak) IBOutlet UILabel *hours; 
@property (nonatomic, weak) IBOutlet UILabel *minutes; 
@property (nonatomic, weak) IBOutlet UILabel *seconds; 
@property (nonatomic, weak) IBOutlet UILabel *millisecs; 

@property (nonatomic, readwrite) NSTimeInterval counter; 
@property (nonatomic, strong) NSTimer *timer; 

@property (nonatomic, readwrite) int hoursInt; 
@property (nonatomic, readwrite) int minutesInt; 
@property (nonatomic, readwrite) int secondsInt; 
@property (nonatomic, readwrite) int millisecsInt; 

@end 

@implementation ViewController 

#define MS_COUNT_STEP 20.0 // Approx 50 fps 

- (IBAction)countUpPressed:(id)sender { 
    [self.timer invalidate]; 
    self.timer = [NSTimer scheduledTimerWithTimeInterval:MS_COUNT_STEP/1000.0 target:self selector:@selector(countUp) userInfo:nil repeats:YES]; 
} 

- (IBAction)countDownPressed:(id)sender { 
    [self.timer invalidate]; 
    self.timer = [NSTimer scheduledTimerWithTimeInterval:MS_COUNT_STEP/1000.0 target:self selector:@selector(countDown) userInfo:nil repeats:YES]; 
} 

- (void)countUp { 
    self.counter += (MS_COUNT_STEP/1000.0); 
} 

- (void)countDown { 
    self.counter -= (MS_COUNT_STEP/1000.0); 
} 

- (void)setCounter:(NSTimeInterval)counter { 
    _counter = counter; 
    [self updateUI]; 
} 

- (void)updateUI { 
    NSTimeInterval counter = _counter; 

    self.hoursInt = counter/3600; 
    counter -= ((int)self.hoursInt * 3600); 

    self.minutesInt = counter/60; 
    counter -= ((int)self.minutesInt * 60); 

    self.secondsInt = (int)counter; 
    counter -= self.secondsInt; 

    self.millisecsInt = counter * 1000; 
} 

- (void)setHoursInt:(int)value { 
    if (value != _hoursInt) { 
     _hoursInt = value; 
     self.hours.text = [NSString stringWithFormat:@"%i", value]; 
    } 
} 

- (void)setMinutesInt:(int)value { 
    if (value != _minutesInt) { 
     _minutesInt = value; 
     self.minutes.text = [NSString stringWithFormat:@"%i", value]; 
    } 
} 

- (void)setSecondsInt:(int)value { 
    if (value != _secondsInt) { 
     _secondsInt = value; 
     self.seconds.text = [NSString stringWithFormat:@"%i", value]; 
    } 
} 

- (void)setMillisecsInt:(int)value { 
    if (value != _millisecsInt) { 
     _millisecsInt = value; 
     self.millisecs.text = [NSString stringWithFormat:@"%i", value]; 
    } 
} 

@end 
+0

Hallo, danke für den Code, es produziert Millisekunden, aber ich kann es nicht mit dem datePicker verbinden. Ich habe den Code am Ende hinzugefügt, wie ich versucht habe, es zu verbinden. –

+0

So habe ich versucht, den datePicker an Ihren "Counter" anzuschließen. { self.countDownTime = (NSTimeInterval) _datePicker.countDownDuration; Rest = self.countDownTime; _counter = self.countDownTime - Rest; self.timer = [NSTimer terminatedTimerWithTimeInterval: MS_COUNT_STEP/1000.0 Ziel: self-Selektor: @selector (countDown) userInfo: keine Wiederholungen: YES]; } –

+0

Würden Sie nicht einfach verwenden: "self.counter = self.dataPicker.countDownDuration"? – norders

0

Verwenden CADisplayLink statt NSTimer.

Ein CADisplayLink-Objekt ist ein Timer-Objekt, mit dem Ihre Anwendung die Zeichnung mit der Aktualisierungsrate der Anzeige synchronisieren kann.

Mit [NSTimer terminatedTimerWithTimeInterval: 1 ...] kann das System die Etiketten nicht mit dieser Geschwindigkeit zeichnen.