2010-06-14 13 views
24

Ok, ho cercato online e ho anche cercato in un paio di libri la risposta perché non riesco a capire la documentazione Apple per NSTimer. Sto cercando di implementare 2 timer sulla stessa vista che ognuno ha 3 pulsanti (START - STOP - RESET).Esempio di timer di base per l'iPhone

Il primo timer esegue il conto alla rovescia da 2 minuti e quindi emette un segnale acustico.

Il secondo timer conta fino a 00:00 a tempo indeterminato.

Suppongo che tutto il codice verrà scritto nei metodi dietro i 3 pulsanti diversi ma sono completamente perso nel tentativo di leggere la documentazione Apple. Qualsiasi aiuto sarebbe molto apprezzato.

+0

vedere http://stackoverflow.com/questions/3519562/how-do-i-write-a-timer-in-objective-c –

risposta

35

Fondamentalmente quello che vuoi è un evento che si attiva ogni 1 secondo, o eventualmente a intervalli di 1/10 di secondo, e aggiornerai l'interfaccia quando il timer ticcherà.

Quanto segue creerà un timer e lo aggiungerà al ciclo di esecuzione. Salva il timer da qualche parte in modo da poterlo uccidere quando necessario.


- (NSTimer*)createTimer { 

    // create timer on run loop 
    return [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerTicked:) userInfo:nil repeats:YES]; 
} 

Ora scrivere un gestore per la graduazione del timer:

 
- (void)timerTicked:(NSTimer*)timer { 

    // decrement timer 1 … this is your UI, tick down and redraw 
    [myStopwatch tickDown]; 
    [myStopwatch.view setNeedsDisplay]; 

    // increment timer 2 … bump time and redraw in UI 
    … 
} 

Se l'utente preme un pulsante, è possibile ripristinare i conteggi, o avviare o arrestare il ticchettio. Per terminare un timer, invia un messaggio non valido:


- (void)actionStop:(id)sender { 

    // stop the timer 
    [myTimer invalidate]; 
} 

Spero che questo ti aiuti.

+0

Prima di tutto, grazie mille per l'aiuto ma sono ancora un po ' confuso. Cosa utilizzo per UILabel e IBAction? Il tuo codice non sembra avere quelli che dovrebbero essere lì dentro - non dovrebbe? – startuprob

+0

I * highly * consiglia di ritirare una copia del libro di Aaron Hillegass, Cocoa (R) Programming per Mac (R) OS X (3rd Edition). Se leggi questo e segui gli esempi, acquisirai una solida comprensione di Objective-C e Cocoa, incluso Interface Builder. Onestamente, per $ 30 e un po 'di tempo, è probabilmente il miglior investimento che si possa fare. Devi correre, piccola da sfamare! –

+0

Sì, in risposta al tuo commento, ho saltato l'implementazione dell'interfaccia utente. Hai ragione, hai bisogno di un UIWindow, con un UIView contenente alcuni controlli che generano eventi quando gli utenti li toccano. Gli eventi dovranno essere indirizzati ai metodi con tag IBAction nel tuo controller di visualizzazione. E come hai detto tu, un UILabel o due per tenere le tue letture del cronometro. –

11

Seguirò l'approccio di Jonathan eccetto che dovresti usare un NSDate come riferimento per l'aggiornamento dell'interfaccia utente. Significa invece di aggiornare il segno di spunta basato sul NSTimer, quando il NSTimer si attiva, si fa la differenza tra NSDate per ora e la data di riferimento.

La ragione di ciò è che NSTimer ha una risoluzione di 50-100 ms, il che significa che il timer può diventare piuttosto impreciso dopo alcuni minuti se c'è molto da fare per rallentare il dispositivo. L'uso di NSDate come punto di riferimento garantisce che l'unico intervallo tra l'ora effettiva e l'ora visualizzata sia nel calcolo di tale differenza e il rendering del display.

+1

So che è vecchio, ma nessuno lo trova: NSTimer in realtà mantiene quella risoluzione tra gli incendi, il che significa che sarà sempre preciso con una risoluzione di 50-100 ms, mai (in casi diversi da casi estremi) peggio di così. Vedi Tolleranza del timer nella [Documentazione NSTimer] (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSTimer_Class/). – nickRise

+0

@robotpsyche ha ragione, ho provato a usare 'NSTimer' su due dispositivi (iphone e ipad), indovina un po ', in 20 minuti la differenza tra i timer era 12 secondi !!!, questo non è affatto accettabile, userò' NSDate'. –

Problemi correlati