Swift3 - UIImageView不会出现在已解析的JSON数据中

时间:2017-06-27 02:27:48

标签: ios json swift3 jsonparser

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

这是EventCell类的片段。

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类本身的片段。

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;
    }
}

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

3 个答案:

答案 0 :(得分:2)

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

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

注意

需要考虑的几点

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

添加此扩展程序

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")