NSTimer: Creare un cronometro per iPhone

      1 commento su NSTimer: Creare un cronometro per iPhone

Come si può intuire dal titolo del post oggi andremo a creare un semplice cronometro per iPhone proprio come abbiamo fatto per Mac.

cronometro iphone

Andrò abbastanza veloce con la prima parte del tutorial in quanto l’uso di NSTimer riguarda già un livello intermedio di conoscenza.

Dunque iniziamo subito con la creazione di un nuovo progetto di tipo view-based application e tramite interface builder iniziamo subito a costruire l’interfaccia che avrà la nostra applicazione:

inseriamo:

  • 1 x UILabel che indicherà il tempo
  • 1 x UIButton che servirà per lo Start e lo Stop del cronometro

adesso colleghiamo gli aggetti dell’interfaccia con l’header (file .h) attraverso l’assistant automatico di Xcode 4 oppure col metodo classico dichiarando gli IBOutlet.

Dichiariamo gli oggetti:

[code lang=”obj-c”]IBOutlet UILabel *timeLabel;
NSTimer *timer;[/code]

Quindi dichiariamo le azioni che andremo ad implementare:

[code lang=”obj-c”]- (void)updateTimer;
-(IBAction)actionTapped:(id)sender;[/code]

Quindi spostiamoci nel file d’implementazione (.m) ed iniziamo a far funzionare gli oggetti che abbiamo inserito:

[code lang=”obj-c”]- (void)updateTimer
{
NSDate *currentDate = [NSDate date];
NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:startDate];
NSDate *timerDate = [NSDate dateWithTimeIntervalSince1970:timeInterval];</pre>
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"HH:mm:ss.SSS"];
[dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]];
NSString *timeString=[dateFormatter stringFromDate:timerDate];
timeLabel.text = timeString;
[dateFormatter release];
}
-(IBAction)actionTapped:(id)sender{
if (!timer) {
self.startDate = [NSDate date];
//richiamiamo l’aggiornamento del timer ogni decimo di secondo (1/10)
self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 / 10.0
target:self
selector:@selector(updateTimer)
userInfo:nil
repeats:YES];
[self updateTimer];
// impostiamo il testo del pulsante a STOP
actionButton.text=@"Stop";
}

// se il timer è già attivo allora significa che dobbiamo fermarlo
else {
if ([timer isValid]) {
//stop del timer.
[timer invalidate];
}
self.timer = nil;
[self updateTimer];
// impostiamo il testo del pulsante a START
actionButton.text=@"Start";
}
}
[/code]

In aggiunta possiamo anche creare un pulsante di reset per azzerare la lebel semplicemente pulendo la label:

[code lang=”obj-c”][timer invalidate];
timer = nil;
[timeLabel setText:@"00:00:00.000"];[/code]