1
votes

L'image ne s'affiche pas dans la collection

Lorsque j'exécute ce code, il ne montre rien dans ma collectionView . Mon code -

   class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {

        @IBOutlet weak var collectionView: UICollectionView!
        var AllImage: [String] = []
          var boolValue = false

        override func viewDidLoad() {
            super.viewDidLoad()

            collectionView.delegate = self
            collectionView.dataSource = self

            downloadJson()
        }

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

        func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
            let cell:CollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! CollectionViewCell
            cell.myImage.image = UIImage(named: AllImage[indexPath.row])
            return cell

        }

        //MARK: Image
        func downloadJson(){
            var access_token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOjEwMjc2LCJpc3MiOiJodHRwczovL2hvbWlpdGVzdC5jby56YS9hcGkvbG9naW4iLCJpYXQiOjE1NTIxOTYwMjIsImV4cCI6MTU1NDc4ODAyMiwibmJmIjoxNTUyMTk2MDIyLCJqdGkiOiJBeTY5R0JkZDA5dWdFTDBhIn0.czpQQsC08vuTB8iGdTeEjjQUmzl6I5Cs0VQ8WeA5VaY"
            let headers = ["Authorization": "Bearer "+access_token+"", "Content-Type": "application/json"]
            Alamofire.request("https://homiitest.co.za/api/gallery", method: .get,  parameters: nil, encoding: JSONEncoding.default, headers: headers).responseJSON { response in
                if response.result.isSuccess{
                    print(response)

                    let swiftyJson = JSON(response.data!)

                    let productTemplate = swiftyJson["data"].array
                    print("hello there - \(productTemplate)")

                    for product in productTemplate! {

                        if let data = product["data"].bool {
                            continue
                        } else
                        {
                            print("I am in this block")
                            self.AllImage.append(product.stringValue)

                        }
                        self.collectionView!.reloadData()
                    }

                }

            }

        }
    }

Réponse - entrez la description de l'image ici


7 commentaires

Que contient AllImage - images, données ou liens http?


Essayez Kingfisher


Votre analyse de json est erronée. Vous devez attribuer un tableau d'url d'image directement dans self.AllImage = productTemplate . Vous obtenez également l'URL de l'image, vous devez donc la télécharger ou utiliser une bibliothèque de chargement paresseux pour afficher votre image à partir d'une URL telle que AlamofireImage .


AllImage est un tableau d'URL de chaîne et que vous définissez directement en obtenant un nom, de sorte qu'il est possible que vous deviez le télécharger, puis le charger dans la vue de collection. utilisez celui-ci stackoverflow.com/a/51746517/10150796


Utilisez-vous des pods?


@FaysalAhmed oui


s'il vous plaît utiliser la version miniature des images afin que le défilement soit si fluide, maintenant c'est un peu lent car maintenant toute la version image HQ pour mobile


5 Réponses :


1
votes

UIImage (nommée: String) charge une image à partir du catalogue d'actifs. Comme AllImage contient des URL d'images, vous devrez d'abord télécharger chaque image avant de l'afficher. Je recommanderais d'utiliser une bibliothèque ( Kingfisher est une excellente et assez facile à utiliser). Vous devrez remplacer cette ligne de code

let url = URL(string: AllImage[indexPath.row])
cell.myImage.kf.setImage(with: url)

par

cell.myImage.image = UIImage(named: AllImage[indexPath.row])


8 commentaires

Je dois installer le Kingfisher avant d'utiliser votre code. Droit?


@MdRashedPervez Je n'ai pas besoin d'utiliser une bibliothèque tierce pour cette chose simple, utilisez celle-ci stackoverflow.com/a/51746517/10150796 en ajoutant simplement cette fonction.


Oui, vous devrez l'installer à l'aide de Cocoapods ou de Carthage, selon ce que vous utilisez.


@NikunjKumbhani Eh bien, Kingfisher a également d'autres avantages, comme la mise en cache et l'annulation des demandes lors de la réutilisation de cellules afin qu'aucune image ne s'affiche dans la mauvaise cellule. Je préfère éviter beaucoup de code passe-partout, c'est pourquoi je l'ai recommandé. Acclamations.


@ FadyA.Ackad Oui, je sais, mais ma fonction encaisse également les images téléchargées et affiche également l'image d'espace réservé jusqu'au chargement de l'image réelle.


@ FadyA.Ackad je reçois ceci - Valeur du type facultatif 'UIImage?' doit être déballé pour faire référence au membre 'kf' du type de base encapsulé 'UIImage'


@NikunjKumbhani mais cela n'annule pas la demande lorsqu'une cellule est réutilisée, cela entraînera donc un problème de course où deux demandes se chargent pour le même imageView, ce qui entraînera le remplacement de l'autre. Selon ce qui prend le plus de temps


@MdRashedPervez Désolé, il y a eu une erreur dans mon code. Je l'ai corrigé. Essayez-le maintenant



1
votes

Ajoutez simplement cette fonction

// Here imgPicture = your imageView
// UIImage(named: "placeholder") is Display image brfore download and load actual image. 

NKPlaceholderImage(image: UIImage(named: "placeholder"), imageView: cell.myImage, imgUrl: AllImage[indexPath.row]) { (image) in }

Remplacez simplement

cell.myImage.image = UIImage(named: AllImage[indexPath.row])

par

func NKPlaceholderImage(image:UIImage?, imageView:UIImageView?,imgUrl:String,compate:@escaping (UIImage?) -> Void){

    if image != nil && imageView != nil {
        imageView!.image = image!
    }

    var urlcatch = imgUrl.replacingOccurrences(of: "/", with: "#")
    let documentpath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
    urlcatch = documentpath + "/" + "\(urlcatch)"

    let image = UIImage(contentsOfFile:urlcatch)
    if image != nil && imageView != nil
    {
        imageView!.image = image!
        compate(image)

    }else{

        if let url = URL(string: imgUrl){

            DispatchQueue.global(qos: .background).async {
                () -> Void in
                let imgdata = NSData(contentsOf: url)
                DispatchQueue.main.async {
                    () -> Void in
                    imgdata?.write(toFile: urlcatch, atomically: true)
                    let image = UIImage(contentsOfFile:urlcatch)
                    compate(image)
                    if image != nil  {
                        if imageView != nil  {
                            imageView!.image = image!
                        }
                    }
                }
            }
        }
    }
}

Celui-ci est votre première image d'un tableau.

 entrez la description de l'image ici

p>


6 commentaires

bro..il me donne un écran vide comme avant.


@MdRashedPervez pouvez-vous me partager l'URL de n'importe qui de votre tableau AllImage ? Parce que cela fonctionne du code dans mon projet swift 4 .


@MdRashedPervez Je mets à jour votre première image dans ma réponse qui, grâce à cette fonction, fonctionne très bien.


J'ajoute votre fonction dans mon code existant et remplace le code dans mon cellForItemAt indexPath .. mais mon frère, je n'ai pas eu de sortie à voir.


@MdRashedPervez assurez-vous que IBOutlet d'Imageview doit être connecté car vous voyez que la sortie est là, elle fonctionne bien.


Continuons cette discussion dans le chat .



0
votes

Essayez ceci si vous ne souhaitez pas installer le pod. let imageCache = NSCache ()

cell.myImage.imageFromServerURL(AllImage[indexPath.row], placeHolder:PLACEHOLDER_IMAGE)

Utilisez:

extension UIImageView {

    func imageFromServerURL(_ URLString: String, placeHolder: UIImage?) {

        self.image = nil
        if let cachedImage = imageCache.object(forKey: NSString(string: URLString)) {
            self.image = cachedImage
            return
        }

        self.image = placeHolder

        if let url = URL(string: URLString) {
            URLSession.shared.dataTask(with: url, completionHandler: { (data, response, error) in
                if error != nil {
                    print("ERROR LOADING IMAGES FROM URL: \(String(describing: error))")
                    return
                }
                DispatchQueue.main.async {
                    if let data = data {
                        if let downloadedImage = UIImage(data: data) {
                            imageCache.setObject(downloadedImage, forKey: NSString(string: URLString))
                            self.image = downloadedImage
                        }
                    }
                }
            }).resume()
        }
    }
}

faites-moi savoir si vous avez des doutes.


0 commentaires

0
votes

Vous pouvez toujours utiliser Alamofire si vous ne souhaitez pas utiliser une autre bibliothèque comme AlamofireImage , AFNetworking , SDWebImage , etc.

cell.myImage.showImages(AllImage[indexPath.row])

Vous pouvez l'utiliser comme ceci:

extension UIImageView {

func showImages(imageURL: String) {
    Alamofire.request(imageURL, method: .get)
        .validate()
        .responseData(completionHandler: { (responseData) in
            self.image = UIImage(data: responseData.data!)
        })
}}


0 commentaires

1
votes

Veuillez formater votre code de téléchargement, vous n'enregistrez pas la chaîne d'URL dans le tableau pour charger correctement les images. J'ai mis à jour le code. Veuillez vous référer ci-dessous.

//MARK: Image
    func downloadJson(){
        let access_token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOjEwMjc2LCJpc3MiOiJodHRwczovL2hvbWlpdGVzdC5jby56YS9hcGkvbG9naW4iLCJpYXQiOjE1NTIxOTYwMjIsImV4cCI6MTU1NDc4ODAyMiwibmJmIjoxNTUyMTk2MDIyLCJqdGkiOiJBeTY5R0JkZDA5dWdFTDBhIn0.czpQQsC08vuTB8iGdTeEjjQUmzl6I5Cs0VQ8WeA5VaY"
        let headers = ["Authorization": "Bearer "+access_token+"", "Content-Type": "application/json"]
        Alamofire.request("https://homiitest.co.za/api/gallery", method: .get,  parameters: nil, encoding: JSONEncoding.default, headers: headers).responseJSON { response in
            if response.result.isSuccess{
                //print(response)

                let swiftyJson = JSON(response.data!)

                let productTemplate = swiftyJson["data"].array
                //print("hello there - \(productTemplate)")

                for product in productTemplate! {
                    // print(product["image_medium"].stringValue)
                    self.AllImage.append(product.stringValue)
                    print("this is data - \(product.stringValue)")
                }
                self.collectionView!.reloadData()

            }

        }

    }


0 commentaires