如何在Swift中的Collection View上显示图像数组

时间:2017-08-02 05:19:19

标签: swift3 uicollectionview uicollectionviewcell uicollectionviewlayout

func numberOfSections(in collectionView: UICollectionView) -> Int {
    return 1
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
     print("gallery count : \(self.arrayGallerySingle.count)")
    return self.arrayGallerySingle.count
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "gallerycell", for: indexPath) as! GalleryViewCell
return cell
}

//API Fetching method
func galleryFetch(){

    let prs = [
        "id": dealIDGallery,
        "deal_single_page": "1" as String
    ]

    Service.StartWithoutLoading(prs as [String : AnyObject]?, onCompletion: { result in
        let jsonResponseSingle = result as? NSDictionary
        print(" jsonResponse\(String(describing: jsonResponseSingle))")

        if let resultGallery = jsonResponseSingle?.value(forKey: "result") as? NSArray{

            for keyValuesGallery in resultGallery {

                let gallerySingle = (keyValuesGallery as AnyObject).value(forKey: "gallery_images") as? NSArray

                print("Gallery Images Key: \(gallerySingle)")
                self.arrayGallerySingle = gallerySingle as! [AnyObject]

                DispatchQueue.main.async { () -> Void in
                    self.collectionView?.reloadData()

                }
            }

        }
    })
}

如何在UICollectionViewCell上显示带有键gallery_images的图像数组?此行print("Gallery Images Key: \(gallerySingle)")在控制台上打印所需的图像数组,但我无法在collectionView上显示。我的JSON回复是http://www.jsoneditoronline.org/?id=8eccb63976d76be7d0b2d1b0e8f02306。我也在我的项目中使用SDWebImage。我已经检查过datasource连接& collectionView IBoutlet以及单元格内的图像。我是Swift的帮助初学者,如果需要,还有任何进一步的信息请问

2 个答案:

答案 0 :(得分:1)

Swift 3.0这是我的更新答案希望它也能帮助某人

func numberOfSections(in collectionView: UICollectionView) -> Int {
    return 1
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
     print("gallery count : \(self.arrayGallerySingle.count)")
    return self.arrayGallerySingle.count

}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "gallerycell", for: indexPath) as! GalleryViewCell
   if let imgUrl = arrayGallerySingle[indexPath.row] as? String {
        if let url = NSURL(string: imgUrl) {
            cell.galleryImage?.sd_setImage(with: url as URL, placeholderImage: UIImage(named: "place holder image"), options: .lowPriority)
        }
        else{
            let alertController = UIAlertController(title: "No Gallery Images", message: "test", preferredStyle: .alert)
            let okButton = UIAlertAction(title: "Okay", style: .default, handler: nil)
            alertController.addAction(okButton)
            alertController.present(alertController, animated: true, completion: nil)
        }
    }
return cell
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
    return UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
    return 0.0
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
    return 0.0
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
{
    return CGSize(width: collectionView.frame.size.width/2, height: collectionView.frame.size.height/3)

}

func galleryFetch(){

    let prs = [
        "id": dealIDGallery,
        "deal_single_page": "1" as String
    ]

    Service.StartWithoutLoading(prs as [String : AnyObject]?, onCompletion: { result in
        let jsonResponseSingle = result as? NSDictionary
        print(" jsonResponse\(String(describing: jsonResponseSingle))")

        if let resultGallery = jsonResponseSingle?.value(forKey: "result") as? NSArray{

            for keyValuesGallery in resultGallery {

                let gallerySingle = (keyValuesGallery as AnyObject).value(forKey: "gallery_images") as? NSArray

                print("Gallery Images Key: \(gallerySingle)")
                self.arrayGallerySingle = gallerySingle as! [AnyObject]

                if self.arrayGallerySingle.count > 0 {

                    DispatchQueue.main.async { () -> Void in
                        self.collectionView?.reloadData()

                    }
                } else {
                    let alertController = UIAlertController(title: "Message", message: "No images found.", preferredStyle: .alert)
                    alertController.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: self.doSomething))
                    self.present(alertController, animated: true, completion: nil)
                }
            }
        }
    })
}

答案 1 :(得分:0)

Swift 3.0

您可以使用SDWebcache以这种方式实现在collectionView单元格图像中加载图像。

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "gallerycell", for: indexPath) as! GalleryViewCell

            if let imgUrl = arrayGallerySingle[indexPath.row] as? String {
                if let url = URL(string: imgUrl) {
                   //Replace with your imageView outlet
                    cell.imageView.sd_setImageWithURL(url, placeholderImage: UIImage(named: "place holder image"), options: .lowPriority)
                }
            }
            return cell
        }

如果要在collectionView中显示6个单元格,则必须将UICollectionViewLayout方法设置为定义的单元格大小,如下所示。

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
    {
    return CGSize(width: collectionView.frame.size.width/2, height: collectionView.frame.size.height/3)

}

当数组计数不为空时,您可以显示警报,以及为什么在for循环中重新加载Collection视图,如下所示实现它。

Service.StartWithoutLoading(prs as [String : AnyObject]?, onCompletion: { result in
            let jsonResponseSingle = result as? NSDictionary
            print(" jsonResponse\(String(describing: jsonResponseSingle))")

            if let resultGallery = jsonResponseSingle?.value(forKey: "result") as? NSArray{

                for keyValuesGallery in resultGallery {

                    let gallerySingle = (keyValuesGallery as AnyObject).value(forKey: "gallery_images") as? NSArray

                    print("Gallery Images Key: \(gallerySingle)")
                    self.arrayGallerySingle = gallerySingle as! [AnyObject]
                }

                if self.arrayGallerySingle.count > 0 {

                    DispatchQueue.main.async { () -> Void in
                        self.collectionView?.reloadData()

                    }

                } else {
                    let alertController = UIAlertController(title: "Your Title", message: "their is no images", preferredStyle: .alert)
                    alertController.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil))
                    self.present(alertController, animated: tru, completion: nil)
                }

            }
        })