TableView单元格图像没有图像的图像

时间:2018-02-23 10:15:23

标签: swift firebase

我正在从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
}

3 个答案:

答案 0 :(得分:1)

在tableview中重复使用单元格,因此即使在特定路径上没有图像,也不需要惊讶为什么要在单元格上获取图像。 如果你能观察到  当您从没有图片的单元格中调用getData方法时,我认为您收到的情况errorcell.someImageimageCache

中均未设置任何内容

我的建议是,如果要在单元格中显示临时图像,以防没有可用的图像,那么在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
}