当 uitableview 滚动时,UIProgressView 显示在错误的行上
UIProgressView shows on incorrect row when uitableview is scroll
在 UITableView
中,我有一个带有下载按钮的自定义单元格。点击下载按钮后,我用 indexPath.row
更新标签,下载功能进度视图显示在该单元格中。问题是当用户滚动并且单元格变得不可见时,特定的进度视图开始显示在不同的单元格中。
这是我的 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
}
请指教
最有可能的问题是,您没有在重复使用后重新初始化单元格。当您将一个新单元格出队时,它可能会重新使用刚刚滚出屏幕的单元格之一。如果显示进度条并且您从未将出队单元格初始化为没有进度条,那么只要您重新使用有进度条的单元格,它就会出现。
所以我认为您只需要确保在将单元格出列后初始化单元格。
在您的 cellForRowAtIndexPath 中,我认为您需要添加一个 else 语句来处理未下载且未设置进度条的单元格:
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()
}
在 UITableView
中,我有一个带有下载按钮的自定义单元格。点击下载按钮后,我用 indexPath.row
更新标签,下载功能进度视图显示在该单元格中。问题是当用户滚动并且单元格变得不可见时,特定的进度视图开始显示在不同的单元格中。
这是我的 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
}
请指教
最有可能的问题是,您没有在重复使用后重新初始化单元格。当您将一个新单元格出队时,它可能会重新使用刚刚滚出屏幕的单元格之一。如果显示进度条并且您从未将出队单元格初始化为没有进度条,那么只要您重新使用有进度条的单元格,它就会出现。
所以我认为您只需要确保在将单元格出列后初始化单元格。
在您的 cellForRowAtIndexPath 中,我认为您需要添加一个 else 语句来处理未下载且未设置进度条的单元格:
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()
}