代码之家  ›  专栏  ›  技术社区  ›  user979331

带UITableView单元格的Swift 4 AlamOfireImage

  •  10
  • user979331  · 技术社区  · 6 年前

    我正在使用AlamOfireImages尝试从服务器下载图像并将其显示在我的表视图单元格中,这是我得到的,但我的图像没有显示,只有文本标签和详细文本标签

    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
        }
    
    10 回复  |  直到 6 年前
        1
  •  1
  •   Divya Thakkar    6 年前

    试试这个:

     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!)
                    }
    

    这对我来说很好。 希望这会有所帮助。

        2
  •  4
  •   seyha    6 年前

    当然,您的图像不会显示给您。因为当Alamoire开始下载你的图像时,它的进程在后台线程中。但是您在主线程或UI线程中工作,所以您需要从后台切换到主线程,它将为您工作。

    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
                }
            }
    }
    

    如果您认为这样做很困难,我建议您使用这个名为kingfisher的库,它将为您处理异步加载图像,使您的单元表能够顺利运行。

    链接: https://github.com/onevcat/Kingfisher

        3
  •  0
  •   Jignesh Mayani    6 年前

    可以使用sdwebimage

    首先你需要导入这个

    import SDWebImage
    

    那么你可以用这个方法

    let imgUrl = URL(string:"your image URL string")
    cell.imageView?.sd_setImage(with: imgUrl, placeholderImage: UIImage(named: "propic"))
    
        4
  •  0
  •   Umair Afzal    6 年前

    使用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.
        })
    }
    
        5
  •  0
  •   Ajay saini    6 年前

    您的代码是正确的。 我认为传输安全性会通过HTTP阻止您的映像。 将此添加到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>
    

    你也可以使用Alamoire的图像库。只需添加pod alamofireimage。

        6
  •  0
  •   Niraj Paul    6 年前

    首先,你必须检查一下,如果你得到了正确的响应,而不是像这样写代码

    Alamofire.request(imageUrl!, method: .get).response { response in
    
                               if let image = UIImage(data: response.data!) {
                              cell. imageView?.image = image
                         }
          }
    
        7
  •  0
  •   Dávid Pásztor    6 年前

    这对我有帮助:

    首先创建此函数以帮助下拉图像。如果要提取多个图像,可能需要创建一个新的swift文件并使其成为静态文件,或者只在需要的文件中调用它。通过这种方式,您可以引用它,而不是重新编写代码:

    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()
    }
    

    然后下拉信息:

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

    那你就可以走了。

        8
  •  0
  •   Vasilis D.    6 年前

    您应该将链接作为变量传递给单元格中的变量,并重写uiTableViewCell中的awakefromnib函数。在awakefrom nib中,您调用alamofire请求在单元中加载图像,这样,您就不会在每次重用单元时调用查询。

    所以

    //单元格代码

    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)
    
        9
  •  0
  •   Thien Liu    6 年前

    您需要在主线程中运行此代码。

    DispatchQueue.main.async {
        cell.imageView?.image = image
    }
    
        10
  •  0
  •   Threadripper    5 年前

    Swift-5支持的代码工作良好

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
        let cell = tblView.dequeueReusableCell(withIdentifier: "cell") as! TableViewCell
        cell.lblName.text = arrData[indexPath.row]["name"] as? String
    
      let imageUrl = arrData[indexPath.row]["imageUrl"] as? String
    
        Alamofire.request(imageUrl!, method: .get).response { response in
            guard let image = UIImage(data:response.data!) else {
                // Handle error
                return
            }
            let imageData = image.jpegData(compressionQuality: 1.0)
            cell.imgCourses.image = UIImage(data : imageData!)
        }
    
        return cell
    }