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
}
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.
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.
Vous devez exécuter ce code dans le thread principal.
DispatchQueue.main.async {
cell.imageView?.image = image
}
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.
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.
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
}
}
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"))
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)
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.
})
}