我正在使用alamofire从json文件中获取url图像,并希望在单元格中显示从json到imageview的图像。我是快速和迅速的网络新手。
我在MainCollectionViewController上的代码:
private let reuseIdentifier = "Cell"
class MainCollectionViewController: UICollectionViewController {
var result:String = ""
override func viewDidLoad() {
super.viewDidLoad()
}
override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}
override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of items
return 1
}
override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! MainCollectionViewCell
Alamofire.request(.POST, "URL That Contain JSON").responseJSON { response in
if let value = response.result.value {
let json = JSON(value)
let data = json["data"].arrayValue
self.result = data[0]["image"].stringValue
print(self.result)
}
}
let imageName = (result)
cell.mainImageView.image = UIImage(named:imageName)
return cell
}
图像插座位于MainCollectionViewCell:
class MainCollectionViewCell: UICollectionViewCell {
@IBOutlet weak var mainImageView: UIImageView!
}
构建成功但图像没有出现,它显示内部没有图像的单元格。
答案 0 :(得分:2)
Alamofire仍在请求JSON但您在响应到达之前已更新UIImageView
。在Alamofire
回复之前,您的代码会尝试使用尚未收到的结果更新UIImageView
,使您的Result
字符串仍为空字符串,就像您在顶部声明的那样。这就是为什么你变空UIImageView
。
override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! MainCollectionViewCell
Alamofire.request(.POST, "URL That Contain JSON").responseJSON { response in
if let value = response.result.value {
let json = JSON(value)
let data = json["data"].arrayValue
self.result = data[0]["image"].stringValue
print(self.result)
let imageName = (result)
cell.mainImageView.image = UIImage(named:imageName)
}
}
return cell
}
然而,在更新单元格时,不需要进行加载请求。
答案 1 :(得分:0)
响应在不同的线程中运行,所以那时“结果”没有数据。在响应将解决您的问题后尝试加载。
override func viewDidLoad() {
super.viewDidLoad()
getImage()
}
func getImage()
{
Alamofire.request(.POST, "URL That Contain JSON").responseJSON { response in
if let value = response.result.value {
let json = JSON(value)
let data = json["data"].arrayValue
self.result = data[0]["image"].stringValue
print(self.result)
}
//reload collection view
}
override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! MainCollectionViewCell
let decodedData = NSData(base64EncodedString: result, options: NSDataBase64DecodingOptions(rawValue: 0))
let decodedimage = UIImage(data: decodedData!)
cell.mainImageView.image = decodedimage
return cell
}
答案 2 :(得分:0)
在你的代码中,你没有注册你的笔尖。
self.collectionView.registerNib(UINib(nibName: "MainCollectionViewCell", bundle: nil), forCellReuseIdentifier: "MainCollectionViewCell")
将此代码放在ViewDidLoad
答案 3 :(得分:0)
您只是从服务器获取图像网址而不是图像,所以首先应该下载图像然后在mainImageView中设置。