Swift3 - UIImageView 没有从解析的 JSON 数据中出现

Posted

技术标签:

【中文标题】Swift3 - UIImageView 没有从解析的 JSON 数据中出现【英文标题】:Swift3 - UIImageView isn't appearing from parsed JSON data 【发布时间】:2017-06-27 02:27:47 【问题描述】:

大家好,我的第一个问题很想得到帮助。我花了很长时间浏览论坛,但仍在努力理解我在哪里出错了。 URL 字符串从 JSON 中解析得很好,但是它没有在我创建的 UIImageView 中显示为图像。代码编译正常,其他一切都在显示。我假设我必须将 String 类型的 URL 转换为 UIImageView 但是我不断收到错误。

这里是 EventCell 类的 sn-p。

class EventCell: UICollectionViewCell 

var event: Event?   
    didSet  

        if let eventName = event?.title 
            eventTitle.text = eventName
        

        eventSubtitle.text = event?.subtitle

        eventTags.text = event?.tags

        if let imageName = event?.imageURL
        
            imageView.image = UIImage(named: imageName)
        
    


override init(frame: CGRect)    
    super.init(frame: frame)

    setupViews()


required init?(coder aDecoder: NSCoder) 
    fatalError("init(coder:) has not been implemented")



let imageView: UIImageView =  
    let iv = UIImageView()
    iv.translatesAutoresizingMaskIntoConstraints = false
    iv.contentMode = .scaleAspectFill
    return iv
()

这里是 Event 类本身的 sn-p。

var id: NSNumber?
var title: String?
var imageURL: String?
var subtitle: String?
var tags: String?
var desc: String?

override init()

init(event: NSDictionary)

    if let val = event["ID"] as? NSNumber
    
        id = val;
    

    if let val = event["Title"] as? String
    
        title = val;
    

    if let val = event["Subtitle"] as? String
    
        subtitle = val;
    

    if let val = event["Tags"] as? String
    
        tags = val;
    

    if let val = event["Description"] as? String
    
        desc = val;
    

    if let val = event["image"] as? String
    
        imageURL = val;
    

任何帮助将不胜感激!谢谢!

【问题讨论】:

您不能只从 URL 字符串初始化 UIImage。您需要下载图像数据,然后从数据初始化。 确保您有一个名为 imageName 的文件。您不能使用外部链接创建图像。 用你得到的error更新问题。还要更新代码 sn-p 你得到error 您需要先下载带有此 url 的图像,我建议使用 SDWebImage 库来帮助您,然后设置 UIImageView.image = yourDownloadedImage 不相关,但Event 中的所有属性都是可选的,为什么要选择绑定每个值? 【参考方案1】:

初始化程序UIImage(named:) 需要已经存储在包中的图像的名称。在您的情况下,您想从URL 加载图像。您应该做的是从String 创建一个URL,然后将该URL 的内容加载为NSData,最后从该Data 创建一个UIImage。实现这一目标的最快方法是

if let imageURLString = event?.imageURL 
    let imageURL = URL(string: imageURLString!)
    let imageData = NSData(contentsOf: imageURL!)
    imageView.image = UIImage(data: imageData as! Data)

注意

需要考虑的几点

这不是从URL 加载图像的最佳方法。您还应该查看async 请求。但是,这是最快的实现,应该可以让代码正常工作 sn-p 采用Swift 3 语法。我假设您可以将其转换为 Swift 2 如果您正在使用它

【讨论】:

非常感谢马利克!代码现在运行并且图像编译。但是,是的,你是对的。应用程序非常缓慢,几乎无法使用。您是否还建议从单独的线程加载图像? 很高兴能提供帮助。是的,最好将它加载到单独的线程中。查看 Alamofire (github.com/Alamofire/Alamofire)【参考方案2】:

添加这个扩展

extension UIImageView 
    public func imageFromUrl(urlString: String) 
        if let url = URL(string: urlString) 
            URLSession.shared.dataTask(with: url, completionHandler:  (data, response, error) in
                if (error != nil) 
                    print(error?.localizedDescription ?? "no errror")
                
                else 
                    if let image = UIImage(data: data!) 
                        DispatchQueue.main.async 
                            self.image = image
                        
                    
                
            ).resume()
        
    

用法:

imageView.imageFromUrl(urlString: "http://linktoyourimage.com")

【讨论】:

【参考方案3】:

根据 Apple 文档,UIImage(named:) 需要您的应用程序包中的名称。您可以在 dataWithContentsOfURL: 方法中传递图像的 url。虽然使用这种方法很好,但您只需要异步处理,因为 dataWithContentsOfURL: 是一个同步请求并阻塞主线程,直到下载完成。

考虑使用 SDWebImage 一个 UIImageView 扩展,它添加来管理图像下载和显示。它还支持一个占位符图像,您可以提供该图像以指示下载正在进行中。

希望对您有所帮助。快乐编码!

【讨论】:

谢谢luckyShubra。是的,我现在可以看到已经实施了此请求使应用程序无法使用的修复,因此必须查看此扩展程序。再次感谢。 很高兴您能解决您的问题。 SDWebImage 是易于使用的 UIImageView 扩展。查看上面链接中的详细信息。

以上是关于Swift3 - UIImageView 没有从解析的 JSON 数据中出现的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3将图像从URL添加到UIImageView [重复]

从解压缩下载的文件中禁用 Safari

UIImageView 周围的填充。斯威夫特 3

如何将图片分配给 UIImageView (Swift 3)

L1正则化和L2正则化(从解空间角度)

L1正则化和L2正则化(从解空间角度)