El uso del timer en una vista de tabla crea el timer después de cualquier recarga de desplazamiento o tabla

Estoy usando https://github.com/mineschan/MZTimerLabel/ y en my Tableview cellForRowAtIndex utilizando el timer como a continuación:

UILabel *lblTimer=(UILabel *)[cell viewWithTag:10]; MZTimerLabel *UpgradeTimer = [[MZTimerLabel alloc] initWithLabel:lblTimer andTimerType:MZTimerLabelTypeTimer]; [UpgradeTimer setCountDownTime:timestamp]; [UpgradeTimer startWithEndingBlock:^(NSTimeInterval timestamp) { lblTimer.text = @"✔"; }]; 

Pero después de cualquier tabla de recarga o desplazamiento, el timer se comporta de manera extraña y parece que vuelve a generar múltiples timeres para contar en el mismo lugar. ¿Cómo debería solucionarlo mientras uso este timer?

Aprecie cualquier ayuda,

Elias

MZTimerLabel un vistazo a MZTimerLabel , y viola gravemente a MVC. Pone en la vista algo que pertenece al model (el timer que count está abajo del time). De ahí proviene tu problema. Las vistas deberían poder ser recreadas sin tener efectos secundarios en el model.

Recomendaría abandonar esa class y crear la tuya. En realidad, es bastante fácil lograr algo como esto.

  1. Cree una nueva class que guarde un título y un endDate.
  2. Almacene instancias de esa class en el model que respalda su tabla.
  3. Cree un NSTimer que actualice la tablaView
  4. Configura tus celdas.

Eso es básicamente todo el código que necesitas para una count regresiva básica en una table. Debido a que no almacena ningún dato en la vista, puede desplazarse tanto como desee:

 @interface Timer : NSObject @property (strong, nonatomic) NSDate *endDate; @property (strong, nonatomic) NSString *title; @end @implementation Timer @end @interface MasterViewController () { NSArray *_objects; NSTimer *_refreshTimer; } @end @implementation MasterViewController - (void)viewDidLoad { [super viewDidLoad]; NSMutableArray *modelStore = [NSMutableArray arrayWithCapacity:30]; for (NSInteger i = 0; i < 30; i++) { Timer *timer = [[Timer alloc] init]; timer.endDate = [NSDate dateWithTimeIntervalSinceNow:i*30]; timer.title = [NSString stringWithFormat:@"Timer %ld seconds", (long)i*30]; [modelStore addObject:timer]; } _objects = modelStore; } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [_refreshTimer invalidate]; // timer should not exist, but just in case. _refreshTimer = [NSTimer timerWithTimeInterval:0.5f target:self selector:@selector(refreshView:) userInfo:nil repeats:YES]; // should fire while scrolling, so we need to add the timer manually: [[NSRunLoop currentRunLoop] addTimer:_refreshTimer forMode:NSRunLoopCommonModes]; } - (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; [_refreshTimer invalidate]; _refreshTimer = nil; } - (void)refreshView:(NSTimer *)timer { // only refresh visible cells for (UITableViewCell *cell in [self.tableView visibleCells]) { NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; [self configureCell:cell forRowAtIndexPath:indexPath]; } } #pragma mark - Table View - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return _objects.count; } - (void)configureCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { Timer *timer = _objects[indexPath.row]; cell.textLabel.text = timer.title; NSInteger timeUntilEnd = (NSInteger)[timer.endDate timeIntervalSinceDate:[NSDate date]]; if (timeUntilEnd <= 0) { cell.detailTextLabel.text = @"Finished"; } else { NSInteger seconds = timeUntilEnd % 60; NSInteger minutes = (timeUntilEnd / 60) % 60; NSInteger hours = (timeUntilEnd / 3600); cell.detailTextLabel.text = [NSString stringWithFormat:@"%02ld:%02ld:%02ld", (long)hours, (long)minutes, (long)seconds]; } } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; [self configureCell:cell forRowAtIndexPath:indexPath]; return cell; } @end 

introduzca la descripción de la imagen aquí