web-dev-qa-db-fra.com

Swift 4 AlamofireImage avec UITableView Cell

J'utilise AlamofireImages pour essayer de télécharger une image à partir d'un serveur et de l'afficher dans ma cellule d'affichage de la table. C'est ce que j'ai obtenu, mais mes images ne s'affichent pas. Seules textLabel et detailTextLabel.

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "trendingCell", for: indexPath)

        print(self.array[indexPath.row])

        cell.textLabel?.text = (self.array[indexPath.row]["title"] as! String)

        cell.detailTextLabel?.text = (self.array[indexPath.row]["username"] as! String)

        Alamofire.request("http://xxxxxxx.com/uploads/" + (self.array[indexPath.row]["cover"] as! String)).responseImage { response in
            if let image = response.result.value {
                cell.imageView?.image = image
            }
        }

        return cell
    }
11
user979331

Essaye ça:

 Alamofire.request(imageUrl!, method: .get).response { response in
                    guard let image = UIImage(data:response.data!) else {
                        // Handle error
                        return
                    }
                    let imageData = UIImageJPEGRepresentation(image,1.0)
                    cell.myImage.image = UIImage(data : imageData!)
                }

Cela fonctionne très bien pour moi. Espérons que cela vous sera utile.

1
Divya Thakkar

Bien sûr, votre image ne sera pas affichée pour vous. Parce que quand Alamofire commence à télécharger votre image son processus en arrière-plan. Mais vous travaillez dans le fil principal ou le fil d'interface utilisateur, vous devez donc passer de l'arrière-plan au fil principal, cela fonctionnera pour vous. 

Alamofire.request("http://xxxxxxx.com/uploads/" + (self.array[indexPath.row]["cover"] as! String)).responseImage { response in
       DispatchQueue.main.async {
            if let image = response.result.value {
                cell.imageView?.image = image
            }
        }
}

Si vous pensez que cela vous est difficile, je vous recommande d'utiliser cette bibliothèque appelée Kingfisher, qui gérera le chargement d'images asynchrones qui permettent le bon fonctionnement de la table de votre cellule.

Lien: https://github.com/onevcat/Kingfisher

4
seyha

Vous devez exécuter ce code dans le thread principal.

DispatchQueue.main.async {
    cell.imageView?.image = image
}
1
Thien Liu

votre code est correct. Je pense que la sécurité des transports bloque votre image sur http. Ajoutez ceci dans votre fichier info.plist 

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>         //put your domain name here
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

et vous pouvez également utiliser la bibliothèque d'images d'alamofire. Ajoutez simplement pod alamofireImage. 

0
Ajay saini

Cela m'a aidé:

Créez d'abord cette fonction pour aider à réduire l'image. Si vous tirez plusieurs images, vous pouvez créer un nouveau fichier Swift et le rendre statique ou simplement l'appeler dans le fichier dont vous avez besoin. De cette façon, vous pouvez vous y référer au lieu de réécrire le code:

static func loadImage(_ imageView: UIImageView,_ urlString: String) {
    let imgURL: URL = URL(string: urlString)!
    URLSession.shared.dataTask(with: imgURL) { (data, respond, error) in
        guard let data = data, error == nil else { return}

        DispatchQueue.main.async (execute: {
            imageView.image = UIImage(data: data)  
        })
    }.resume()
}

Ensuite, pour descendre les infos:

if let logoName = variable.logo {
        StaticFileName.loadImage(cell.imgVariableInCell, "\(logoName)")
    }
    return cell
}

Alors vous êtes prêt à partir. 

0
A True Novice

Vous devez d'abord vérifier, avez-vous la bonne réponse si vous avez la réponse que d'écrire le code comme  

Alamofire.request(imageUrl!, method: .get).response { response in

                           if let image = UIImage(data: response.data!) {
                          cell. imageView?.image = image
                     }
      }
0
Niraj Paul

Vous pouvez utiliser SDWebImage 

Vous devez d'abord importer ceci 

import SDWebImage

Ensuite, vous pouvez utiliser cette méthode 

let imgUrl = URL(string:"your image URL string")
cell.imageView?.sd_setImage(with: imgUrl, placeholderImage: UIImage(named: "propic"))
0
Jignesh Mayani

Vous devez passer le lien en tant que variable à une variable de la cellule et remplacer la fonction awakefromnib dans UITableViewCell. À l'intérieur de la commande awakeFrom, vous appelez la requête alamofire pour charger l'image dans la cellule. Ainsi, vous n'appellerez pas la requête à chaque fois qu'elle réutilise la cellule.

alors 

// CellCode 

import Alamofire
...

    var imageLink:String?

    override func awakeFromNib() {
            super.awakeFromNib()
    Alamofire.request(imageLink).responseImage { response in
                if let image = response.result.value {
                    self.imageView?.image = image
                }
            }
    }


//cell configuration
cell.imageLink = "http://xxxxxxx.com/uploads/" + self.array[indexPath.row]["cover"] as! String)
0

Utiliser AlamofireImages

if let url = URL(string: "your url") {

    cell.imageView?.af_setImage(withURL:url, placeholderImage: nil, filter: nil,  imageTransition: .crossDissolve(0.2), runImageTransitionIfCached: false, completion: {response in
      // do stuff when is downloaded completely.
    })
}
0
Umair Afzal