Temporizador de count atrás – iPhone

Quiero mostrar el timer de count regresiva. Tengo la date de inicio y la date de finalización. Necesito mostrar el time restante como

días: horas: minutos: segundos

¿Cómo puedo hacer esto?

puede configurar coundown como mi código siguiente:

-(void) viewWillAppear:(BOOL)animated { timer = [NSTimer scheduledTimerWithTimeInterval: 1.0 target:self selector:@selector(updateCountdown) userInfo:nil repeats: YES]; } 

Y

  -(void) updateCountdown { NSString *dateString = @"14-12-2012"; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"dd-MM-yyyy"]; NSDate *dateFromString = [[NSDate alloc] init]; // voila! dateFromString = [dateFormatter dateFromString:dateString]; NSDate *now = [NSDate date]; NSCalendar *calendar = [NSCalendar currentCalendar]; NSDateComponents *componentsHours = [calendar components:NSHourCalendarUnit fromDate:now]; NSDateComponents *componentMint = [calendar components:NSMinuteCalendarUnit fromDate:now]; NSDateComponents *componentSec = [calendar components:NSSecondCalendarUnit fromDate:now]; NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents *componentsDaysDiff = [gregorianCalendar components:NSDayCalendarUnit fromDate:now toDate:dateFromString options:0]; lblDaysSetting.text=[NSString stringWithFormat:@"%02d",componentsDaysDiff.day]; lblHouresSetting.text=[NSString stringWithFormat:@"%02d",(24-componentsHours.hour)]; lblMinitSetting.text=[NSString stringWithFormat:@"%02d",(60-componentMint.minute)]; lblSecSetting.text=[NSString stringWithFormat:@"%02d",(60-componentSec.second)]; } 

ahora solo configura tu lógica

su salida del código como mi proyecto como abajo :: –

introduzca la descripción de la imagen aquí

este es el código para el file .h:

 @interface UIMyContoller : UIViewController { NSTimer *timer; IBOutlet UILabel *myCounterLabel; } @property (nonatomic, retain) UILabel *myCounterLabel; -(void)updateCounter:(NSTimer *)theTimer; -(void)countdownTimer; @end 

y aquí está el código para el file .m:

 @implementation UIMyController @synthesize myCounterLabel; int hours, minutes, seconds; int secondsLeft; - (void)viewDidLoad { [super viewDidLoad]; secondsLeft = 16925; [self countdownTimer]; } - (void)updateCounter:(NSTimer *)theTimer { if(secondsLeft > 0 ){ secondsLeft -- ; hours = secondsLeft / 3600; minutes = (secondsLeft % 3600) / 60; seconds = (secondsLeft %3600) % 60; myCounterLabel.text = [NSString stringWithFormat:@"%02d:%02d:%02d", hours, minutes, seconds]; } else{ secondsLeft = 16925; } } -(void)countdownTimer{ secondsLeft = hours = minutes = seconds = 0; if([timer isValid]) { [timer release]; } NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; timer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateCounter:) userInfo:nil repeats:YES]; [pool release]; } 

espero que esto ayude. feliz encoding

adrian

Recomendaría el siguiente método para get componentes de time de date a date.

Este método es más elegante que decrementar manualmente 3 variables enteras por hora, minuto y segundo porque hacerlo significaría que debe verificar manualmente cuando un segundo golpe 0, debe restablecer manualmente el minuto a 59 y así sucesivamente. Una vez fui por esta ruta, no fue muy buena.

Además, cuando minimizas tu aplicación, el reloj de count regresiva se detendrá. Si disminuía manualmente su timer de count regresiva utilizando 3 integers (hora, minuto y segundos), minimizar su aplicación hará que la count no funcione.

Como este método calcula automáticamente la diferencia entre dos dates, incluso cuando la aplicación regresa del estado minimizado de background, recalcula automáticamente el time restante para usted sin ningún código adicional.

 -(void)viewDidLoad { // instantiate a calendar object. gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; countDownTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateClock:) userInfo:nil repeats:YES]; [countDownTimer fire]; } -(void)updateClock:(NSTimer *)timer { countDownDateFormatter = [[NSDateFormatter alloc] init]; [countDownDateFormatter setDateFormat:@"hh:mm:ss"]; NSDate *now = [NSDate date]; NSDateComponents *comp = [gregorianCalendar components:NSHourCalendarUnit|NSMinuteCalendarUnit|NSSecondCalendarUnit fromDate:now toDate:countDownEndDate options:0]; NSString *strTimeRemaining = nil; // if date have not expinetworking if([now compare:countDownEndDate] == NSOrdenetworkingAscending) { strTimeRemaining = [[NSString alloc] initWithFormat:@"%02d:%02d:%02d", [comp hour], [comp minute], [comp second]]; } else { // time has expinetworking, set time to 00:00 and set boolean flag to no strTimeRemaining = [[NSString alloc] initWithString:@"00:00:00"]; [countDownTimer invalidate]; countDownTimer = nil; } lblCountDown.text = strTimeRemaining; [countDownDateFormatter release]; [strTimeRemaining release]; }