2015-02-10 3 views
0

В пределах UITableView у меня есть пользовательская ячейка с кнопкой загрузки. После нажатия кнопки «Загрузить» я обновляю тег indexPath.row, и в этой ячейке отображается представление прогресса выполнения загрузки. Проблема заключается в том, что когда пользователь прокручивает и ячейка становится невидимой, этот конкретный вид прогресса начинает отображаться в другой ячейке.UIProgressView показывает неправильную строку, когда uitableview является прокруткой

Это моя cellForRowAtIndexPath функция:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    var cell:CellWithDownload! = tableView.dequeueReusableCellWithIdentifier("CellWithDownload") as CellWithDownload 
    var title = rowDataAll[indexPath.row].valueForKey("BayanTitle") as String 
    cell.TitleLabel.text = title 
    cell.AuthorLabel.text = rowDataAll[indexPath.row].valueForKey("Artist") as? String 
    var countOfLikesString = 
    cell.downloadButton.tag = indexPath.row 
    cell.downloadButton.addTarget(self, action: Selector("downloadAudio:"), forControlEvents: UIControlEvents.TouchUpInside) 

    // If cell becomes visible again, then star   

    if let isDownloading = rowDataAll[indexPath.row].valueForKey("isDownloading") { 

     if (isDownloading as NSString == "true") { 
      cell.showDownloading() 
      cell.progressView.progress = getDownloadObjectWithURL(url).progress 
     } else if (isDownloading as NSString == "completed") {     
      cell.hideDownloading()     
     } 
    }   
    return cell 
} 

Пожалуйста, советы.

+0

Что вы делаете в 'downloadAudio:'? –

+0

В моей загрузке Audio, я использую: 'var indexSelectedTableView: NSInteger = sender.tag rowDataAll [indexSelectedTableView] .setValue (" true ", forKey:" isDownloading ") var cell: CellWithDownload = self.tableView? .cellForRowAtIndexPath (NSIndexPath (forRow: sender.tag, inSection: 0)) as CellWithDownload cell.showDownloading() ' –

ответ

1

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

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

В вашем cellForRowAtIndexPath я думаю, что вам нужно еще заявление добавило, чтобы иметь дело с клеткой, которая не скачивая и не устанавливали индикатора:

if let isDownloading = rowDataAll[indexPath.row].valueForKey("isDownloading"){ 
    <Your existing code seems to setup the progress bar here> 
} 
else{ 
    <Set it to have no pogress bar in here.> 
    cell.hideDownloading() 
} 
+0

См. обновленный ответ. В принципе, не предполагайте, что ячейка совершенно новая после dequeueReusableCellForIndexPath. Вам нужно все инициализировать. –

+0

Это работает отлично. Большое спасибо Рори. –