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 [重复]