嘿,伙计们会在我的第一个问题上得到一些帮助。我花了很多时间浏览论坛,但仍在努力了解我在哪里出错。 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;
}
}
任何帮助将不胜感激!谢谢!
答案 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")