【问题标题】:Custom UItableViewCell not loading Image? Swift 4自定义 UItableViewCell 不加载图像?斯威夫特 4
【发布时间】:2017-12-04 13:58:00
【问题描述】:

我是 Xcode 的新手,很快就遇到了这个错误。我搜索了一下,找不到关于这个主题的任何内容。我有一个 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

【问题讨论】:

  • 最好使用 URLRequest 并设置 cachePolicy 选项
  • 我认为更多信息会有所帮助。例如,哪一段代码正在执行,哪一段没有?这可能是一个逻辑错误的简单案例。你能设置一些断点并澄清代码正在经历的事件链吗?
  • @Malik 我知道 Url 正在进入 loadImageUsingCacheWithUrlString 的事实我得到了打印在控制台中的 url 女巫是上面的一行代码
  • 您可以使用它,它有助于以异步方式在表格视图单元格上加载图像。 github.com/rs/SDWebImage

标签: ios swift xcode uitableview


【解决方案1】:

在您的故事板中,imageView messageImage 是视图 messageBackground 的子视图。在 cellForRow 方法中的 if-statement 中,您将 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 被隐藏,它的子视图也被隐藏。可能需要在这里重新考虑您的业务逻辑。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-22
  • 2017-03-24
  • 1970-01-01
  • 1970-01-01
  • 2019-08-02
相关资源
最近更新 更多