func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath) as! ViewAllCell
stringClassObj = stringClassArray[indexPath.row]
cell.modelNameLbl.text = stringClassObj.model
cell.brandLbl.text = stringClassObj.vehicleTitle
cell.fuelTypeLbl.text = stringClassObj.fuelType
cell.priceLbl.text = stringClassObj.Price
cell.discountLbl.text = "5%"
let URLBaseString = "http://vehiclebuzzzz.com/"
let url = URL(string:URLBaseString .appending(stringClassObj.vehicleImage!))
DispatchQueue.global().async
{
let dataurl = try? Data(contentsOf: url!)
DispatchQueue.main.async
{
cell.productImageView.image = UIImage(data: dataurl!)
}
self.tableViewObj.reloadData()
}
return cell
}
回答
原因是你正在加載數據在後臺隊列,這需要一段時間,一旦數據可用,你更新單元格(在主線程中,這是正確的)。但是,在數據加載完畢後,您可以上下滾動表格視圖,因此單元格消失可能位於頂部,並將在底部重新用於其他數據。現在背景加載已經完成了finisehd(舊的單元格的圖像數據已經在頂部消失了),並且更新了重用的單元格,這應該顯示出不同的東西。
怎麼辦:
- 不要存儲在後臺關閉到UICellView的引用,但存儲索引路徑
- 當主線程更新,檢查圖像路徑仍清晰可見,然後獲取屬於該路徑的單元並更新它。
也有一個很好的教程由蘋果公司(也表現出了一些WWDC年前): https://developer.apple.com/library/content/samplecode/LazyTableImages/Introduction/Intro.html
你能給我一些這個例子im新的 –
@Yerra,只需檢查LazyTableImages示例。它涵蓋了幾乎所有你想要的,包括停止不再需要的數據下載。我認爲只是嘗試理解Apple的解決方案並且將其翻譯成Swift(並將其放在github上)會是一次很好的培訓。我也可以做到這一點,如果你陷入困境,但不是在今晚(德國時區)之前。 –
謝謝我明白了 –
試試這個 -
創建一個UIImageView擴展
extension UIImageView {
public func imageFromServerURL(urlString: URL) {
URLSession.shared.dataTask(with: urlString, completionHandler: { (data, response, error) -> Void in
if error != nil {
print(error as Any)
return
}
OperationQueue.main.addOperation {
let image = UIImage(data: data!)
self.image = image
}
}).resume()
}
}
和更新cellForRowAt
如下 -
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath) as! ViewAllCell
stringClassObj = stringClassArray[indexPath.row]
cell.modelNameLbl.text = stringClassObj.model
cell.brandLbl.text = stringClassObj.vehicleTitle
cell.fuelTypeLbl.text = stringClassObj.fuelType
cell.priceLbl.text = stringClassObj.Price
cell.discountLbl.text = "5%"
let URLBaseString = "http://vehiclebuzzzz.com/"
let url = URL(string:URLBaseString .appending(stringClassObj.vehicleImage!))
cell. productImageView.imageFromServerURL(urlString: url!)
return cell
}
而且您的自定義單元格類中添加`prepareForReuse」的方法 -
override func prepareForReuse() {
super.prepareForReuse()
//here set all control values to nil like below
self.productImageView.image = nil
}
希望它會工作:)
這是一個棘手的想法!但是對於這種特殊情況,它有一個小缺點:如果你有很多單元並且滾動速度很快,它會繼續加載已經滾動的數據「看不見」,所以沒有辦法停止隱形下載細胞。蘋果解決方案(來自我的答案)將停止下載已經變得不可見的單元格。 –
- 1. Tableview原型單元格高於其他單元格
- 2. TableView在滾動時更改單元格內容
- 3. UISwitch在滾動tableview時更改單元格
- 4. 如何更改tableView中Xcode的原型單元格的高度?
- 5. TableView單元格在滾動上消失
- 6. 在iOS中滾動TableView時保留表格單元值
- 7. 在tableView上更改背景單元格?
- 8. 動態更改tableView單元格高度
- 9. 我可以安全使用dequed tableView單元格作爲原型
- 10. TableView不滾動,單元格未啓用
- 11. 在TableView中更新一個單元格
- 12. TableView與多個原型單元格
- 13. 我正在使用自定義類來製作tableview單元格。當我滾動tableview值時什麼消失了?
- 14. 在TableView中移動單元格
- 15. 在TableView中移動單元格
- 16. iPhone Tableview在水平滾動中使用單元格不垂直
- 17. TableView中的組單元格
- 18. TableView單元格停止滾動單元格
- 19. 在iOS中的立方體效果中滾動tableview單元格?
- 20. 在動態tableview中更改特定單元格Swift
- 21. 動態TableView與原型單元格中的CollectionView
- 22. 表格單元在我的tableview中是空的。 JavaFX + Scenebuilder
- 23. TableView中的更多單元格
- 24. 如何更改tableview單元格圖像?
- 25. 單擊時使tableView單元格變大
- 26. 更改行高取決於哪種類型的tableview單元格
- 27. 在tableview單元格中的Youtube視頻
- 28. JavaFX TableView單元格設置值更高
- 29. Rxswift更新Tableview單元格值
- 30. tableview滾動不停止點擊如果我動畫tableview單元格
** self.tableViewObj.reloadData()**你爲什麼圖像中調用此加載方法 –
正在調用之前返回單元格是合適的 –
它將重新加載整個tableview一次.. –