在将数据分配给集合视图后从服务器获取数据

时间:2018-04-16 06:43:45

标签: ios swift uicollectionview alamofire

我是快速语言的新手,所以不确定如何解决这个问题。在这里,我试图使用uicollectionview显示图像。但我没有得到正确的输出,因为它在执行时没有在集合视图上显示任何内容。需要帮助的朋友。

查看加载功能

 override func viewDidLoad() {
    super.viewDidLoad()
    ImageGet()
}

收藏视图

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    print(defectImages.count) // returns zero value here
    return defectImages.count
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ImageCell", for: indexPath) as! ImageCell
    cell.image.image = defectImages[indexPath.row]
    return cell
}

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    let mainStoryBoard = UIStoryboard(name: "Main", bundle: nil)
    let largeVC = mainStoryBoard.instantiateViewController(withIdentifier: "ImageDisplayVC") as! ImageDisplayVC
    largeVC.imgImage = defectImages[indexPath.row]

    self.navigationController?.pushViewController(largeVC, animated: true)
}

Alamofire获取图片

func ImageGet() {                  
    let imageId = Int(details.id!)
    let para: Parameters = ["imageId": imageId]

    Alamofire.request(URL_IMG_List, method: .post, parameters: para).responseJSON { response in
        if((response.result.value) != nil) {
            let swiftyJsonVar = JSON(response.result.value!)
            if let resData = swiftyJsonVar["data"].arrayObject {
                self.arrRes = resData as! [[String:AnyObject]]
                for index in 0..<self.arrRes.count{
                self.imageData.file_name = self.arrRes[index]["file_name"] as! String              
                self.completeImagePath = self.get_image_path + self.imageData.file_name
                    self.imgpath.append(self.completeImagePath)

                    guard let url = URL(string: self.completeImagePath) else {return}
                    print(url)
                    if let data = try? Data(contentsOf: url) {
                        guard let image: UIImage = UIImage(data: data) else {return}
                        print(image)
                    self.defectImages.append(image as UIImage)
                    }
                }
                print(self.defectImages.count)
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您需要在从API获取数据后重新加载collectionView,并请检查您是否从collectionView设置了dataSource delegatestoryBoard。如果不是在viewDidLoad()之前写在ImageGet()以下的行下面。

self.collectionView.dataSource = self
self.collectionView.delegate = self

将以下代码替换为您的代码。

func ImageGet() {                  
    let imageId = Int(details.id!)
    let para: Parameters = ["imageId": imageId]

    Alamofire.request(URL_IMG_List, method: .post, parameters: para).responseJSON { response in
        if((response.result.value) != nil) {
            let swiftyJsonVar = JSON(response.result.value!)
            if let resData = swiftyJsonVar["data"].arrayObject {
                self.arrRes = resData as! [[String:AnyObject]]
                for index in 0..<self.arrRes.count{
                self.imageData.file_name = self.arrRes[index]["file_name"] as! String              
                self.completeImagePath = self.get_image_path + self.imageData.file_name
                    self.imgpath.append(self.completeImagePath)

                    guard let url = URL(string: self.completeImagePath) else {return}
                    print(url)
                    if let data = try? Data(contentsOf: url) {
                        guard let image: UIImage = UIImage(data: data) else {return}
                        print(image)
                    self.defectImages.append(image as UIImage)
                    }
                    self.collectionView.reloadData() // RELOAD COLLECTIONVIEW
                }
                print(self.defectImages.count)
            }
        }
    }
}