Ячейка UIProgressView не обновляется после прокрутки UITableView - PullRequest
0 голосов
/ 11 июня 2018

Создание страницы загрузки в приложении, и в UITableView более 10 UIProgressView.Индикаторы выполнения работают нормально, но как только они прокручиваются за пределы экрана и прокручиваются назад, они обновляются один раз, затем они отказываются обновлять больше, хотя они все еще загружаются.

Вот код (очистите другой код длячистый взгляд):

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{

    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as! DownloadCell

    cell.dnProgress.setProgress(pg, animated: true)
    cell.dnProgress.isHidden = false
    return cell
}

 override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    for v in (cell.subviews){
         if let p = v as? UIProgressView{
            self.downloadingProgress.append(p)
         }
    }
    goDownload(cloudData[indexPath.row)
}

 func updateProgress(_ theData:String, percent:Float){
        let i:Int = downloadingArray.index(of: theData)
        self.downloadingProgress[i].setProgress(percent, animated: true)
    }

Я думаю, что это что-то о повторном использовании клеток, кто-нибудь может помочь?

* Решение, вдохновленное идеей Аарона *

Добавить еще один массив для хранения загружаемой ячейки indexPath

 func updateProgress(_ theData:String, percent:Float){
     let i:Int = downloadingArray.index(of: theData)
     let indexPath = dndingIndexPathArr[i]
     if let cell = tableView.cellForRow(at: indexPath) as? DownloadCell{
        cell.dnProgress.setProgress(percent, animated: true)
    }
    saveData.set(percent, forKey: "\(theData)Progress")
}

1 Ответ

0 голосов
/ 11 июня 2018

Несколько лет назад я создал пример приложения, которое демонстрирует эту точную технику.Это не идеально:

https://github.com/chefnobody/Progress

Я предполагаю, что вы не правильно моделируете прогресс каждой загрузки.Важно хранить моделирование этих данных (и любые асинхронные запросы) отдельно от рендеринга ячеек табличного представления, потому что iOS установит и разрушит каждую ячейку, когда она прокручивается за пределы экрана.У вас также могут возникнуть проблемы с многопоточностью.

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

...