Нужно скачать 10 файлов с показом прогресса загрузки для всех 10 файлов после нажатия на любую ячейку таблицы. Каждой ячейке соответствует свой файл( cell1 - file1, cell2 - file2 и т.д ). Все 10 файлов загружаются нормально. Проблема в том, что прогресс загрузки отображается только в нажатой ячейке для одного файла. А нужно чтобы прогресс отображался во всех ячейка для соответствующих им файлов. Как это сделать?
Этот код использую для загрузки файлов:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
for index in 1...10 {
let url = URL(string: "link\(index)")!
let downloadTasks = backgroundSession.downloadTask(with: url)
downloadTasks.resume()
let progressView = progressViews(frame: CGRect(x: CGFloat(0), y: CGFloat(0), width: CGFloat(24), height: CGFloat(24)))
let cell = tableView.cellForRow(at: indexPath)
cell?.accessoryView = progressViews
progressView.startprogressView()
}}
Ответ
В принципе у Вас уже всё готово для решения поставленной Вами задачи, Вы лишь забываете правильно указать ячейку, у которой надо показывать загрузку. Кроме этого, самым лучшим вариантом для Вас будет сохранять индексы необходимых ячеек в какую-нибудь переменную, а зачем при перерисовке из неё извлекать значения (если бы у Вас гарантированно все элементы всегда были бы видимы, то можно было бы решить все проблемы проще). Итак, создаёте такое член-данное у себя в классе:
private var cellsIndexesForLoaing = [Int]()
При нажатии на ячейку инициализируйте данную переменную нужным диапазоном:
public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
self.cellsIndexesForLoaing = [Int](0..<10)
self.table.reloadData() // И не забудьте обновить саму таблицу
}
Затем при перерисовке каждой ячейки проверяйте, надо ли начинать загрузку соответствующего файла:
public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = table.dequeueReusableCell(withIdentifier: "Идентификатор Вашей ячейки", for: indexPath)
let indexOfCell = self.cellsIndexesForLoaing.index(of: indexPath.row)
if (indexOfCell != nil) { // Если текущая ячейка попала в диапазон, то начинаем загрузку
loadFileWithProgress(index: indexPath.row, cell: cell) // Функция для загрузки файлов
self.cellsIndexesForLoaing.remove(at: indexOfCell!) // Если мы начали загрузку, то текущую ячейку можно смело удалять из диапазона
} else {
//Так как ячейки таблицы кешируются и повторно используются, то Вам нужно ещё и вернуть ячейку к первоначальному состоянию (например, просто удалить её accessoryView, а можете ещё и загрузку прервать)
cell.accessoryView = nil
}
return cell
}
Функция для загрузки файла может выглядеть так:
func loadFileWithProgress(index:Int, cell:UITableViewCell) {
let url = URL(string: "link\(index)")!
//let downloadTasks = backgroundSession.downloadTask(with: url)
//downloadTasks.resume()
let progressView = UIView.init(frame: CGRect.init(x: 0, y: 0, width: 20, height: 20))
//let cell = tableView.cellForRow(at: indexPath)
progressView.backgroundColor = UIColor.black
cell.accessoryView = progressView
//progressView.startprogressView()
}
В ней я закомментировал всё лишнее и ради примера устанавливаю в качестве accessoryView обычный чёрный прямоугольник.
Весь код в ответе написан на Swift 3.3.
Комментариев нет:
Отправить комментарий