我是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()
}
}
它没有将图像加载到表视图图像视图中:(忽略随机文本)
这也是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中被遮盖:
答案 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
,因此隐藏了它的子视图。可能需要在此重新考虑您的业务逻辑。