单元格中的图像不会出现

时间:2016-05-13 03:15:37

标签: ios swift uicollectionview uicollectionviewcell alamofire

我正在使用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!
}

构建成功但图像没有出现,它显示内部没有图像的单元格。

4 个答案:

答案 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中设置。