自定义UItableViewCell没有加载图片?斯威夫特4

时间:2017-12-04 04:07:43

标签: ios swift xcode uitableview

我是Xcode的新手并迅速遇到了这个bug。我已经搜了一下,但在这个主题上找不到任何东西。我有一个UIImage的扩展,允许我在这里将图像缓存到手机:

import UIKit

let imageCache = NSCache<AnyObject, AnyObject>()

extension UIImageView{

func loadImageUsingCacheWithUrlString(urlString : String)
{
    self.image = nil;
    // check cache for image first

    if let cachedImage = imageCache.object(forKey: urlString as AnyObject)  as? UIImage {
        self.image = cachedImage;
        return
    }

    let url = URL(string: urlString)
    URLSession.shared.dataTask(with: url!, completionHandler: { (data, response, error) in


        //download hit an error
        if error != nil {
            print(error!)
            return
        }
        DispatchQueue.main.async {

            if  let downloadedImage = UIImage(data: data!){
                imageCache.setObject(downloadedImage, forKey: urlString as AnyObject)
                self.image = downloadedImage
            }

        }
    }).resume()
  }
}

它没有将图像加载到表视图图像视图中:(忽略随机文本)

Table view not loading image

这也是main.storyboard的UItableView:

Updated main.storyboard screen shot

这是我的cellForRowAt:indexPath方法,其中假设要加载图像:

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "cellid" , for: indexPath) as! CustomChatTableViewCell;
    let gray = UIColor(red:0.94, green:0.94, blue:0.94, alpha:1.0)
    let red = UIColor(red:1.00, green:0.22, blue:0.37, alpha:1.0)

    let message = messages[indexPath.item]

    if message.toId == user?.toId{

    cell.messageBackground.backgroundColor = red
        cell.messageLabel.textColor = UIColor.white
    }
    else{
        cell.messageBackground.backgroundColor = gray
        cell.messageLabel.textColor = UIColor.black
    }

    cell.messageLabel.text = message.text

    if let imageUrl = message.imageUrl{
        print(imageUrl)
        cell.messageImage.loadImageUsingCacheWithUrlString(urlString: imageUrl)

        cell.messageImage.isHidden = false;
        cell.messageLabel.isHidden = true
        //cell.messageBackground.isHidden = true;
    }
    else
    {
        cell.messageImage.isHidden = true;
        cell.messageLabel.isHidden = false
        cell.messageBackground.isHidden = false;
    }

    return cell;
}

预期结果:

图像加载到单元格

观察到的结果

图片不加载到单元格中:( 这些代码行:

if let imageUrl = message.imageUrl{
        print(imageUrl)
        cell.messageImage.loadImageUsingCacheWithUrlString(urlString: imageUrl)

实际上我的firebase数据库上的图像打印了一个有效的URL字符串,这很令人困惑,因为它没有加载图像。

重要

我在我的项目的其他部分使用loadImageUsingCacheWithUrlString方法,它工作正常,所以我不认为它的方法....发生了什么?非常感谢你,如果你能解决这个问题,你就是一个了不起的编码器!

我可以将图像放在main.storyboard中并且它可以工作......所以我不知道会出现什么问题... :(

screen shot of updated main.storyboard

图片似乎在扩展中很好:

code with breakpoint and console showing

不确定如果图像在Capture View Hierarchy中被遮盖:

View Hierarchy

1 个答案:

答案 0 :(得分:0)

在您的故事板中,imageView messageImage是视图messageBackground的子视图。在if-statement cellForRow方法中,您要将messageBackground设置为隐藏

if let imageUrl = message.imageUrl{
    print(imageUrl)
    cell.messageImage.loadImageUsingCacheWithUrlString(urlString: imageUrl)

    cell.messageImage.isHidden = false;
    cell.messageLabel.isHidden = true
    cell.messageBackground.isHidden = true;  //THIS IS THE CULPRIT

}

由于隐藏了messageBackground,因此隐藏了它的子视图。可能需要在此重新考虑您的业务逻辑。