Как я могу сохранить состояние UIActivityIndicator в UITableView?

У меня есть UITableView который показывает имена файлов. Когда пользователь нажимает на ячейку, я скачиваю прослушанный файл. Для этого я показываю индикатор активности на левой стороне выбранной ячейки. После окончания загрузки индикатор активности будет скрыт. (Помните, что другое содержимое в ячейке не изменится).

Здесь нет правила кликать только по одной ячейке за раз. Пользователь может нажать любое количество ячеек, чтобы начать процесс загрузки. Я просто запускаю процесс загрузки и добавляю его в очередь операций.

Проблема: Моя проблема, рассмотрим сценарий, когда пользователь нажимает 3 ячейки. Таким образом, три ячейки покажут индикатор активности, чтобы представить их процессы загрузки. Если пользователь прокручивает представление таблицы и возвращается к тем же ячейкам, индикаторы активности были скрыты. Это потому, что метод создания ячеек таблицы будет вызываться только для видимых ячеек. Итак, как я могу сохранить состояние индикатора активности каждой ячейки?

2 ответа

Решение

Вы можете хранить, какой файл загружается. И для каждой строки создайте индикатор активности. Что-то вроде этого:

NSArray* filesArr;

- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString* identifier = @"identifier";
    YoursTableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    if(!cell){
        cell = [[YoursTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
    }
    //.....
    if(filesArr[indexPath.row].downloading)
        [cell.activity startAnimating];
    else
        [cell.activity stopAnimating];
    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(filesArr[indexPath.row].downloading)
         return;
    [self startDownload:filesArr[indexPath.row]];
    filesArr[indexPath.row].downloading = YES;
    [tableView reloadData];
}

Как вы намекаете в своем вопросе, проблема отчасти является артефактом повторного использования клеток. Когда ячейка снята, вы должны обновить ее состояние активности в ячейке, либо создав свойство объекта файла для статуса загрузки, как предложено Sk0prion, либо с помощью некоторой параллельной структуры.

Я бы просто упомянул альтернативу. Если у вас есть только несколько ячеек, вы можете обойтись без повторного использования ячеек и сохранить их в словаре. Избегая повторного использования ячейки, статус по сути, несет ячейка, а не объект, на который она ссылается. Давление памяти явно под вопросом. Я редко встречал случай, когда это предпочтительное решение.

Другие вопросы по тегам