我正在尝试显示项目列表。我的最终游戏是在我的IOS应用程序中显示来自一系列字符串的图像网格,这些字符串是URL和文件名。
我有一个CollectionView,它通过一个String文件名数组显示一个图像网格,并且有效:
阵列:
var tableImages: [String] = ["car.jpg", "bus.jpg", "plane.jpg"]
有效的代码:
cell.imgCell.image = UIImage(named: tableImages[indexPath.row])
我的下一步是找出通过String url数组显示图像网格的代码。这是我的问题。如何从网址显示图片?
数组:
var tableImages: [String] = ["http://www.hotelstmarie.com/wp-content/uploads/2014/12/HSM_Guest-Rooms_1500x750-06-02-2015.jpg", "http://media-cdn.tripadvisor.com/media/photo-s/03/4f/b0/58/aviva-by-kameel.jpg"]
有效的代码:
?
注意:
我已经检查过有关此问题的其他stackoverflow问题,但它们来自多年前,而转向swift已经使他们的答案过时了。
在我弄清楚如何显示网址图片之后,我只会制作一些if语句来识别网址或文件名以使其成为我的最终游戏,但这不是这个问题的一部分。
编辑1
围绕我的代码编码:
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell: CollViewCell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! CollViewCell
cell.labelCell.text = tableData[indexPath.row]
cell.imgCell.image = UIImage(named: tableImages[indexPath.row])
return cell
}
编辑2
使用Alamofire:
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell: CollViewCell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! CollViewCell
cell.labelCell.text = tableData[indexPath.row]
let imageUrl = NSURL(string: tableImages[indexPath.row])
cell.imgCell.af_setImageWithUrl(imageUrl, placeholderImage: nil, filter: nil, imageTransition: .CrossDissolve(0.2))
return cell
}
给出了这个错误:
Value of type 'UIImageView' has no member 'af_setImageWithUrl'
答案 0 :(得分:2)
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell: CollViewCell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! CollViewCell
cell.labelCell.text = tableData[indexPath.row]
if let url = NSURL(string: tableImages[indexPath.row])
{
if let data = NSData(contentsOfURL: url)
{
cell.imgCell.image = UIImage(data: data)
}
}
return cell
}
答案 1 :(得分:1)
你会写:
if let url = NSURL(string: tableImages[indexPath.row]){
let data = NSData(contentsOfURL: url)
let image = UIImage(data: data!)
cell.imgCell.image = image
}
虽然我建议使用现有的Swift库(如Kingfisher)来处理线程管理和缓存,因此您的应用程序在下载时不会内存不足或冻结图片。我目前使用SDWebImage。
答案 2 :(得分:1)
您在此处设置图片的方式:
cell.imgCell.image = UIImage(named: tableImages[indexPath.row])
仅适用于项目中的本地图片,因此您的所有人都会尝试在本地查找与您的网址名称相同的图片。
虽然您可以手动加载图像,但最好的替代方法是使用图像加载库来处理常见问题,例如在视图被回收时避免旧图像加载到新图像之上。
在swift中,我使用了AlamofireImage
,如此:
let imageUrl = NSURL(string: tableImages[indexPath.row])
cell.imgCell.af_setImageWithURL(imageUrl, placeholderImage: nil, filter: nil, imageTransition: .CrossDissolve(0.2))
如您所见,此库使用swift的extensions
,这极大地简化了它的api。
答案 3 :(得分:0)
我使用了AFNetworking库中的Swift版本的UIImageView + AFNetworking,你可以从github获得。非常好用。只需将文件放入项目中即可开始使用,如下所示:
cell.imageView.setImageWithUrl(imageUrl!,placeHolderImage: UIImage(named: "placeholder"))