Cronómetro de iPhone: arranque, pare y arranque, pero no comienza donde lo dejó

Estoy tratando de hacer una aplicación de cronómetro y enfrento problemas para que funcione correctamente. Cuando comienzo el cronómetro y paro y comienzo de nuevo, no continúa desde donde lo dejó. Continúa corriendo como si no se detuviera. Necesita orientación para que funcione correctamente. He estado intentando desde la mañana, el rest de las funciones que he hecho son similares al cronómetro de la manzana, solo esto me fastidia … Aprecie cualquier ayuda …

El código se ve así:

ViewController.h

#import <UIKit/UIKit.h> @interface ViewController : UIViewController<UITableViewDataSource,UITableViewDelegate>{ UILabel *lbl; NSTimer *stopTimer; NSDate *startDate,*currentDate; BOOL running; UIButton *bttn; NSMutableArray *tableItems; NSString *timeString,*currentString; UITableView *tableview; int counter; } @property (strong,nonatomic) IBOutlet UILabel *lbl; @property (strong,nonatomic) IBOutlet UIButton *bttn; @property (strong,nonatomic) NSMutableArray *tableItems; @property (strong,nonatomic) NSString *timeString; @property (strong,nonatomic) IBOutlet UITableView *tableview; -(IBAction)startPressed:(id)sender; -(IBAction)resetPressed:(id)sender; -(void)updateTimer; @end 

ViewController.m

 #import "ViewController.h" @interface ViewController () @end @implementation ViewController @synthesize lbl,bttn,tableItems,timeString,tableview; - (void)viewDidLoad { [super viewDidLoad]; lbl.text = @"00.00.00.0"; running = FALSE; //difference = @"0"; startDate = [NSDate date]; tableItems = [[NSMutableArray alloc] init]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } -(IBAction)startPressed:(id)sender{ if(!running){ running = TRUE; [sender setTitle:@"Stop" forState:UIControlStateNormal]; [bttn setTitle:@"Lap" forState:UIControlStateNormal]; if (stopTimer == nil) { stopTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/10.0 target:self selector:@selector(updateTimer) userInfo:nil repeats:YES]; } }else{ running = FALSE; //startDate = currentDate; //difference = currentString; [sender setTitle:@"Start" forState:UIControlStateNormal]; [bttn setTitle:@"Restart" forState:UIControlStateNormal]; [stopTimer invalidate]; stopTimer = nil; } } -(void)updateTimer{ currentDate = [NSDate date]; NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:startDate]; NSDate *timerDate = [NSDate dateWithTimeIntervalSince1970:timeInterval]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"HH:mm:ss.S"]; [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]]; timeString=[dateFormatter stringFromDate:timerDate]; lbl.text = timeString; } -(IBAction)resetPressed:(id)sender{ if (!running) { [stopTimer invalidate]; stopTimer = nil; tableItems = [[NSMutableArray alloc] init]; startDate = [NSDate date]; lbl.text = @"00.00.00.0"; running = FALSE; } else{ [tableItems insertObject:timeString atIndex:0]; [tableview reloadData]; } } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ return tableItems.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ //Step 1:Check whether if we can reuse a cell UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; //Step2: If there are no new cells to reuse,create a new one if(cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:(UITableViewCellStyleDefault) reuseIdentifier:@"cell"]; } //Step 3: Set the cell text content cell.textLabel.text = [tableItems objectAtIndex:indexPath.row]; //Step 4: Return the row return cell; } @end 

En su método updateTimer , calcula la diferencia de time entre startDate y la date actual. No tiene en count que tendría que restar el time que pasó mientras se detuvo el cronómetro.

Editar:

Sugiero resumir y save todo el time. Intervalos que pasan entre el inicio y el fin.

Agregue una propiedad NSTimeInterval timePassed a su class y modifique su código de esta manera:

 - (void)viewDidLoad { //... timePassed = 0; } -(IBAction)startPressed:(id)sender{ if(!running){ //... startDate = [NSDate date]; //... }else{ NSDate *currentDate = [NSDate date]; NSTimeInterval intervalToAdd = [currentDate timeIntervalSinceDate:startDate]; timePassed += intervalToAdd; //... } -(void)updateTimer{ currentDate = [NSDate date]; NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:startDate]; timeInterval += timePassed; // <<<<< NSDate *timerDate = [NSDate dateWithTimeIntervalSince1970:timeInterval]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"HH:mm:ss.S"]; [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]]; timeString=[dateFormatter stringFromDate:timerDate]; lbl.text = timeString; } -(IBAction)resetPressed:(id)sender{ if (!running) { //... timePassed = 0; //... } //... } 

Citando algún código dentro de mi proyecto activo.

 NSDate *timeStart = [NSDate dateWithTimeIntervalSince1970:0]; NSDate *timeEnd = [timeStart dateByAddingTimeInterval:_timePassed]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"00:00:00"]; [dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]]; NSString *strDate = [dateFormatter stringFromDate:timeEnd]; _timeLabel.text = strDate; 

Así es como hice el mío. Si desea utilizar UILabel como un cronómetro, MZTimerLabel es una increíble solución de dos líneas para usted. Echar un vistazo.

Aclamaciones.