我正在从firebase下载数据,我设法将图像放到正确的单元格中,但我得到的图像是 getData ,它需要图像的文件路径,其中一些没有图像在规定的路径上,但有些我如何在每个单元格上有图像
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = self.tabelview.dequeueReusableCell(withIdentifier: "cell") as! TableCell
cell.commentButton.tag = indexPath.row
cell.nameLabel.text = annoucements[indexPath.row].Name
cell.announcementLabel.text = annoucements[indexPath.row].Announcement
cell.annoucementTitleLabel.text = annoucements[indexPath.row].AnnoucementTitle
cell.dateLabel.text = annoucements[indexPath.row].Date
cell.selectionStyle = .none
let storageRef = Storage.storage().reference()
let islandRef = storageRef.child("Announcement").child("\(annoucements[indexPath.row].key!).jpg")
if let cachedImage = imageCache.object(forKey: annoucements[indexPath.row].key! as AnyObject) as? UIImage{
cell.someImage.image = cachedImage
return cell
}
islandRef.getData(maxSize: 1 * 1024 * 1024) { data, error in
if error != nil {
// Uh-oh, an error occurred!
} else {
print(2)
let image = UIImage(data: data!)
DispatchQueue.main.async { // Adds the images to cache
if let downloadedImage = image {
imageCache.setObject(downloadedImage, forKey: annoucements[indexPath.row].key! as AnyObject)
cell.someImage.image = downloadedImage
}
}
cell.someImage.image = image
}
}
return cell
}
答案 0 :(得分:1)
在tableview中重复使用单元格,因此即使在特定路径上没有图像,也不需要惊讶为什么要在单元格上获取图像。
如果你能观察到
当您从没有图片的单元格中调用getData
方法时,我认为您收到的情况error
在cell.someImage
和imageCache
我的建议是,如果要在单元格中显示临时图像,以防没有可用的图像,那么在getData
方法上执行错误块时,您还应该在缓存上设置该占位符图像,这样它就不会执行一次又一次。并且您可以在自定义单元格的override prepareForReuse
中设置nil,这样就不会得到任何重复的图像。
希望它有用
答案 1 :(得分:0)
当你使用tableView.dequeueReusableCell时,你实际上重用了以前存储的单元格及其数据,
您必须通过在TableCell中调用prepareForReuse来清除其内容的单元格:
override func prepareForReuse() {
super.prepareForReuse()
someImage.image = nil // or some placeholder image
}
答案 2 :(得分:0)
这是我如何实现的。请注意带有占位符图片的else
语句:
let cell = UITableViewCell(style: .default, reuseIdentifier: "CellID")
if let pic = PageDataSource.sharedInstance.angels[indexPath.row].photo {
cell.imageView?.image = pic
cell.setNeedsLayout()
} else if let imgURL = PageDataSource.sharedInstance.angels[indexPath.row].filepath {
Storage.storage().reference(forURL: imgURL).getData(maxSize: INT64_MAX, completion: { (data, error) in
guard error == nil else {
print("error downloading: \(error!)")
return
}
// render
let img = UIImage.init(data: data!)
// store to datasource
PageDataSource.sharedInstance.angels[indexPath.row].photo = img
// display img
if cell == tableView.cellForRow(at: indexPath){
DispatchQueue.main.async {
cell.imageView?.image = img
cell.setNeedsLayout()
}
}
})
} else {
// TODO: TODO: Change Image to a proper placeholder
cell.imageView?.image = UIImage(contentsOfFile: "Angels@2x.png")
}
cell.textLabel?.text = PageDataSource.sharedInstance.angels[indexPath.row].name
return cell
}