2010-06-14 12 views
24

Bien, he buscado en línea e incluso he buscado en algunos libros la respuesta porque no puedo entender la documentación de la manzana para el NSTimer. Estoy tratando de implementar 2 temporizadores en la misma vista que cada uno tiene 3 botones (START - STOP - RESET).Ejemplo de temporizador de iphone básico

El primer temporizador cuenta regresivamente desde 2 minutos y luego emite un pitido.

El segundo temporizador cuenta desde 00:00 indefinidamente.

Supongo que todo el código se escribirá en los métodos detrás de los 3 botones diferentes, pero estoy completamente perdido tratando de leer la documentación de la manzana. Cualquier ayuda sería muy apreciada.

+0

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

Respuesta

35

Básicamente lo que desea es un evento que se dispara cada 1 segundo, o posiblemente en intervalos de 1/10th segundo, y actualizará su UI cuando el temporizador marque.

Lo siguiente creará un temporizador y lo agregará a su ciclo de ejecución. Guarde el temporizador en alguna parte para poder matarlo cuando sea necesario.


- (NSTimer*)createTimer { 

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

Ahora escribe un controlador para el paso del temporizador:

 
- (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 
    … 
} 

Si el usuario pulsa un botón, se pueden restablecer los recuentos, o iniciar o detener el tic-tac. Para finalizar un temporizador, envíe un mensaje invalidado:


- (void)actionStop:(id)sender { 

    // stop the timer 
    [myTimer invalidate]; 
} 

Espero que esto lo ayude.

+0

En primer lugar, muchas gracias por la ayuda, pero todavía estoy un poco confuso. ¿Qué uso para UILabel y IBAction? Parece que su código no tiene los que deberían estar allí, ¿no es así? – startuprob

+0

I * muy * le recomiendo que recoja una copia del libro de Aaron Hillegass, Cocoa (R) Programming for Mac (R) OS X (3ra Edición). Si lee esto y repasa los ejemplos, obtendrá una sólida comprensión de Objective-C y Cocoa, incluido el Interface Builder. Honestamente, por $ 30 y en algún momento, es probablemente la mejor inversión que podrías hacer. Tengo que correr, bebé para alimentar! –

+0

Sí, en respuesta a su comentario, omití la implementación de su UI. Estás en lo cierto, necesitas una ventana UI, con una UIView que contenga algunos controles que generarán eventos cuando los usuarios los toquen. Los eventos deberán enrutarse a los métodos etiquetados IBAction en su controlador de vista. Y como dijiste, una UILabel o dos para sostener tus lecturas del cronómetro. –

11

Seguiría el enfoque de Jonathan, excepto que debe utilizar un NSDate como referencia para actualizar la interfaz de usuario. En vez de actualizar la marca basada en el NSTimer, cuando se dispara el NSTimer, significa que toma la diferencia entre NSDate por ahora y su fecha de referencia.

La razón de esto es que el NSTimer tiene una resolución de 50-100 ms, lo que significa que su temporizador puede ser bastante impreciso después de unos minutos si hay muchas cosas que van a ralentizar el dispositivo. El uso de NSDate como punto de referencia asegurará que el único rezago entre la hora real y la hora mostrada se encuentre en el cálculo de esa diferencia y la representación de la pantalla.

+1

Sé que esto es viejo, pero en caso de que alguien lo encuentre: NSTimer en realidad conserva esa resolución entre incendios, lo que significa que siempre será preciso con una resolución de 50-100 ms, nunca (excepto en casos extremos) peor que eso. Consulte Tolerancia de temporizador en [Documentación de NSTimer] (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSTimer_Class/). – nickRise

+0

@robotpsyche tiene razón, traté de usar 'NSTimer' en dos dispositivos (iphone y ipad), adivinen qué, en 20 minutos la diferencia entre los temporizadores fue 12 segundos !!!, esto no es aceptable en absoluto, voy a usar' NSDate'. –

Cuestiones relacionadas