我在互聯網上搜索了一下,發現了一些解決方案,比如使用prepareForReuse()和在cellForRowAt中使imageview=nil。我已經嘗試了這兩種方法,但它并不奏效。請幫助我找出如何防止UITableViewCell中的影像重復
。下面是我之前嘗試的代碼,
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: EmployeeTableViewCell.self), for: indexPath) as! EmployeeTableViewCell。
cell.onBindCell(employee: directoryPresenter!.getEmployeeItem(position: indexPath.row) )
directoryPresenter!.getProfileImage(id: (directoryPresenter!.getEmployeeItem(position: indexPath.row).employeesID)) { image in.
if let image = image {
cell.profileImage.image = image
} else {
// 默認影像或nil
cell.profileImage.image = UIImage(named: "placeholder_profile_male" /span>)
}
}
cell.actionCallBack = self
return cell。
}
下面是我在自定義表視圖單元格類中添加的代碼,
@IBOutlet weak var profileImage: UIImageView!
override func awakeFromNib() {
super.awakeFromNib()
//初始化代碼。
}
override func setSelected(_ selected。Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
//為選定狀態配置視圖。
}
override func prepareForReuse() {
super.prepareForReuse()
self.profileImage.image = nil。
}
uj5u.com熱心網友回復:
你的圖片是從closure中獲取的,你應該在block callback之前設定它的默認圖片,像這樣:
//default image
cell.profileImage.image = UIImage(named: "placeholder_profile_male" /span>)
//獲取雇員影像。
directoryPresenter!.getProfileImage(id: (directoryPresenter!.getEmployeeItem(position: indexPath.row) .employeeID)) { image in.
//處理異步抓取任務。
//呼叫主佇列以更新UI。
DispatchQueue.main.async {
if let image = image {
cell.profileImage.image = image
}
}
}
如果你的圖片是從URL中獲取的,這里有一個想法,讓URLSession來處理這個作業:
cell.profileImage.image = UIImage(named: "placeholder_profile_male"/span>)
let url = URL(string: urlString)!
URLSession.shared.dataTask(with: url) { (data, response, error) in
if let error = error {
print("錯誤。(error)")
return。
}
let image = UIImage.init(data: data! )
DispatchQueue.main.async {
cell.profileImage.image = image
}
}.resume()
uj5u.com熱心網友回復:
使用影像和占位符的最佳方法。使用SDWebImage
。步驟
安裝pod
。pod 'SDWebImage'安裝成功后。打開你的表視圖控制器類。
import SDWebImage在索引路徑的行的單元格中
//這是一個活動指標,并自動在你的影像上作業
cell.yourImageName.sd_imageIndicator = SDWebImageActivityIndicator.grayLarge
cell.yourImageName.sd_setImage(with: URL(string: yourImageInString)。
placeholderImage: UIImage(named: "yourPlaceHolderImageName")
uj5u.com熱心網友回復:
如果UITableViewCell物件有一個重用識別符號,表視圖在從UITableView方法dequeueReusableCell(withIdentifier:)回傳該物件之前呼叫該方法。為了避免潛在的性能問題,你應該只重置與內容無關的單元格的屬性,例如,阿爾法、編輯和選擇狀態。tableView(_:cellForRowAt:)中的表視圖委托在重復使用單元格時應始終重置所有內容。
如果單元格物件沒有相關的重用識別符號,或者如果您使用 reconfigureRows(at:) 來更新現有單元格的內容,則表視圖不會呼叫此方法。
如果您覆寫此方法,您必須確保呼叫超類的實作。
訪問https://developer.apple.com/documentation/uikit/uitableviewcell/1623223-prepareforreuse
也可以這樣試一下
cell.profileImage.image = nil
directoryPresenter!.getProfileImage(id: (directoryPresenter!.getEmployeeItem(position: indexPath.row) .employeeID)) { image in.
if let image = image {
cell.profileImage.image = image
} else {
// 默認影像或nil
cell.profileImage.image = UIImage(named: "placeholder_profile_male" /span>)
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/311704.html
標籤:
