cellForRowAtIndexPath неправильно отображает ячейки при использовании с NSTimer - PullRequest
0 голосов
/ 19 марта 2019

У меня странная ситуация. У меня есть таблица с фотографиями. Я могу добавить новые фотографии в просмотр таблицы, используя некоторые кнопки. Перед появлением в табличном представлении ячейка должна отображать progressView на случайное количество секунд. Для этого я использую NSTimer. Все работает нормально, за исключением того, что при добавлении нескольких изображений одновременно, также отображается загрузка progressView в некоторых уже загруженных ячейках, если я прокручиваю вверх. Я проверил свое условие if (единственный способ начать загрузку) с помощью NSLog, оно показывает только индексы загрузки ячеек. Я ценю вашу помощь:) Вот код для cellForRowAtIndexPath:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"photoCell"];

PhotoCell *photoCell = (PhotoCell *)cell;
//if there is active timer
if([self.activeTimerIndexArray containsObject:indexPath]){
    [photoCell.resultImageV setHidden:YES];

    UIProgressView *progressView = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleBar];
    progressView.frame = CGRectMake(photoCell.resultImageV.frame.origin.x, photoCell.resultImageV.frame.size.height/2, photoCell.resultImageV.frame.size.width, photoCell.resultImageV.frame.size.height);
    [progressView setTag:11];
        [photoCell.contentView addSubview:progressView];
}
UIImage *img = (UIImage *)[self.resultArray objectAtIndex:indexPath.row];
photoCell.resultImageV.image = img;
return cell;

Вот код для метода updateTimer:

Timer *timerInfo = timer.userInfo;
NSIndexPath *index = timerInfo.forIndex;
PhotoCell *cell = [self.tableView cellForRowAtIndexPath:index];
if(timerInfo.time >= timerInfo.totalTime)
{
    dispatch_async(dispatch_get_main_queue(), ^{
        UIProgressView *prg = [cell viewWithTag:11];
        [prg removeFromSuperview];
        [cell.resultImageV setHidden:NO];
    });
    [timer invalidate];
    //no longer active timer
    [self.activeTimerIndexArray removeObject:timerInfo.forIndex];
}
else
{
    timerInfo.time += 0.01;
    float progress = timerInfo.time/timerInfo.totalTime;
    dispatch_async(dispatch_get_main_queue(), ^{
            UIProgressView *prg = [cell viewWithTag:11];
            prg.progress = progress;
    });
}

UPDATE

Благодаря @vadian я обновил свою модель, создал простой класс для таймеров и использовал массив timerInfo, как указано выше.

...