我从上到下滚动时遇到问题,然后我的tableview
可重复使用的单元格显示旧图像,直到新图像下载完成。
它应显示我的默认图像占位符,直到下载完成后再下载新图像,然后将imageview从图像占位符更改为当前下载图像。我该怎么办?
抱歉英语不好。如果您需要任何信息,请告诉我们,谢谢
更新
TableViewcontroller:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "ItemTableViewCell") as! ItemTableViewCell
let itemInfo = itemInfos[indexPath.row]
var image1 : UIImage?
var image2 : UIImage?
if let imgUrl1 = itemInfo.imageUrl {
image1 = ItemListViewController.imageCache.object(forKey: imgUrl1 as AnyObject) as? UIImage
}
if let imgUrl2 = itemInfo.cookerProfilePicUrl{
image2 = ItemListViewController.imageCache.object(forKey: imgUrl2 as AnyObject) as? UIImage
}
cell.configureCell(iteminfo: itemInfo, img1 : image1 ,img2 : image2)
return cell
}
XIB:
func configureCell(iteminfo:ItemInfo , img1 : UIImage? , img2 : UIImage? ){
if img1 != nil {
imageViewItemPic.image = img1
}
else{
print("hi1")
imageViewItemPic.setImageFromURL(url: iteminfo.imageUrl!)
}
if img2 != nil {
imageViewCookerProfilePic.image = img2
}
else{
imageViewCookerProfilePic.setImageFromURL(url: iteminfo.cookerProfilePicUrl!)
}
labelItemHeading.text = iteminfo.heading
labelItemDescription.text = iteminfo.description
}
更新:
override func awakeFromNib() {
super.awakeFromNib()
self.imageViewItemPic.image = UIImage(named: "resto-placeholder.png")
}
更新:
extension UIImageView {
func setImageFromURL(url: String) {
DispatchQueue.global().async {
let data = NSData.init(contentsOf: NSURL.init(string: url) as! URL)
DispatchQueue.main.async {
let image = UIImage.init(data: data as! Data)
ItemListViewController.imageCache.setObject(image!, forKey: url as AnyObject)
self.image = image
}
}
}
}
答案 0 :(得分:4)
由于它是一个可重复使用的单元,它确实会重复使用"旧图像的单元格。然后,每次在cellForRowAtIndexPath
:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
cell.image=placeholder_image
//then download image
}
答案 1 :(得分:1)
您可以在初始化单元格时在var touchtime = 0;
$('.download-img').on('click', function() {
if(touchtime == 0) {
//set first click
touchtime = new Date().getTime();
} else {
//compare first click to this click and see if they occurred within double click threshold
if(((new Date().getTime())-touchtime) < 800) {
//double click occurred
alert("double clicked");
touchtime = 0;
} else {
//not a double click so set as a new first click
touchtime = new Date().getTime();
}
}
});
中设置默认图像
ItemTableViewCell
修改强>
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
self.image= defaultImage
}
答案 2 :(得分:1)
您必须为每个cellForRowAtIndexPath
函数放置一个图像,在您的代码中需要为图像操作编写else
条件,并且您需要放置一个占位符图像。因为在您向上和向下滚动时会重复使用tableview单元格,因此如果您不放置任何新内容,它将保留旧内容,这就是它显示旧/重复内容的原因。
答案 3 :(得分:0)
正如我遇到同样的问题;在读这个之前。我尝试了不同的方法,如init和awakefromnib。在调用func更新整个UI之前,只要您收到数据就可以了。
另外,请注意我使用var restData
和didSet
(这就是为什么一旦从viewcontroller接收数据就会更新,我不会调用func。如果它是一个func来自viewcontroller您最初将占位符图像放在func的开头,然后再下载新图像并从视图控制器(例如cell.updateUI(data: data)
希望你们觉得这很有用。对我来说,我得到正确的图像,而没有在单元重用上显示预览图像:)
// tableview controller
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell : RestCell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! RestCell
//configure the cell to item
cell.restData = items[indexPath.row]
return cell
}
// UITableviewCell
class RestCell: UITableViewCell {
@IBOutlet var img : UIImageView!
@IBOutlet var lbl : UILabel!
// get data and update.
var restData: RestsModel! {
didSet {
// default img early placeholder set. Eliminates showing old pic in cell reuse
self.img.image = UIImage(named: "60x60placeholder.png")
// Update all values func
updateUI()
}
}
override func awakeFromNib() {
super.awakeFromNib()
// Default image placeholder
//self.img.image = UIImage(named: "60x60placeholder.png")
}
// required init.
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)!
// Color of selected.
let myCustomSelectionColorView = UIView()
myCustomSelectionColorView.backgroundColor = UIColor(red: 234.0/255.0, green: 46.0/255.0, blue: 73.0/255.0, alpha: 0.1) //UIColor(netHex:0xFFFF434)
selectedBackgroundView = myCustomSelectionColorView
}
// updateUI func.
fileprivate func updateUI() {
// download the image
if ( self.restData.image != nil && self.restData.image != "") {
ImageLoader.sharedLoader.imageForUrl(urlString:self.restData.image, completionHandler:{(image: UIImage?, url: String) in
self.img.contentMode = UIViewContentMode.scaleAspectFit
self.img.image = image
})
} else {
self.img.image = UIImage(named: "60x60placeholder.png")
}
self.lbl.text = restData.name as String
}
}
答案 4 :(得分:0)
非常简单不会写很多代码只有两行解决你的问题
cell.thumbnailimage.image = nil
cell.thumbnailimage.setImageWith(imageurl!)
答案 5 :(得分:0)
将imageViews的默认值设置为&#34; nil&#34;在你的xib文件中。这样可以确保在加载新单元格之前不要在单元格上放置图像。
func configureCell(iteminfo:ItemInfo , img1 : UIImage? , img2 : UIImage? ){
//Set the imageViews to nil to make sure no other picture are set
imageViewItemPic.image = nil
imageViewCookerProfilePic.image = nil
//Check if img1 is not nil
if img1 != nil {
imageViewItemPic.image = img1
} else{
print("hi1")
imageViewItemPic.setImageFromURL(url: iteminfo.imageUrl!)
}
//Check if img2 is not nil
if img2 != nil {
imageViewCookerProfilePic.image = img2
} else{
imageViewCookerProfilePic.setImageFromURL(url: iteminfo.cookerProfilePicUrl!)
}
labelItemHeading.text = iteminfo.heading
labelItemDescription.text = iteminfo.description
}