【问题标题】:Swift 4 AlamofireImage with UITableView Cell带有 UITableView 单元的 Swift 4 AlamofireImage
【发布时间】:2018-10-30 15:30:06
【问题描述】:

我正在使用 AlamofireImages 尝试从服务器下载图像并将其显示在我的表格视图单元格中,这是我得到的,但我的图像没有出现,只有 textLabel 和 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
    }

【问题讨论】:

  • 是否调用了cell.imageView?.image = image?您在控制台中有任何错误日志吗? cell.imageView 不为零吗?
  • 您是否通过在完成块中提供print(response) 来检查您的response 是否有效?
  • 能否验证图片url是否有效且请求成功。围绕此功能添加一些额外的日志记录,检查响应是否有效等
  • 这可能看起来很傻,但尝试删除圆角半径,如果您已将任何背景颜色设置为默认值,请删除任何图层操作(如阴影),尝试将剪辑切换到边界,我有同样的问题但是不记得确切的解决方案我做了什么,但我做了上述之一
  • 尝试任何静态图像作为占位符并检查它是否正确显示,或者用户 alamofire 的 imageview 的扩展名imageView.af_setImage( 并打印response

标签: ios swift uitableview alamofire alamofireimage


【解决方案1】:

当然,您的图像不会显示给您。因为当 Alamofire 开始下载你的图像时,它的进程在后台线程中。但是您在主线程或 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

【讨论】:

  • response.result.value,这个响应是什么样的?
  • Alamofire 默认调用主调度队列上的响应处理程序,参见here。因此不需要将处理包装在async 闭包中,除非responseImage 的行为与标准response...es 不同。一切都指向无效的图像或 URL。
【解决方案2】:

试试这个:

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

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

【讨论】:

  • “UITableViewCell”类型的值没有成员“myImage”
  • 'myImage'是UItableviewcell中UIImageView的出口。所以这里你应该写你的IBOutlet变量名。
  • 喜欢,cell.imageView?.image = UIImage(data : imageData!)
  • func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 100.0 } 添加这个...
【解决方案3】:

使用 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.
    })
}

【讨论】:

  • 你得到什么结果?
【解决方案4】:

你可以使用 SDWebImage

首先你需要导入这个

import SDWebImage

那你就可以用这个方法了

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

【讨论】:

  • 我收到此错误Value of type 'UIImageView' has no member 'sd_setImage'
  • 为此您必须添加 SDWebImage 框架并导入此方法将可用
【解决方案5】:

您的代码是正确的。 我认为传输安全通过 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>

您还可以使用 alamofire 的图像库。只需添加 pod alamofireImage。

【讨论】:

    【解决方案6】:

    首先你必须检查,如果你得到了响应,你是否得到了正确的响应,而不是编写类似的代码

    Alamofire.request(imageUrl!, method: .get).response { response in
    
                               if let image = UIImage(data: response.data!) {
                              cell. imageView?.image = image
                         }
          }
    

    【讨论】:

      【解决方案7】:

      这对我有帮助:

      首先创建这个函数来帮助下拉图像。如果您要提取多个图像,您可能需要创建一个新的 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】:

        您应该将链接作为变量传递给单元格中的变量,并覆盖 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】:

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

          DispatchQueue.main.async {
              cell.imageView?.image = image
          }
          

          【讨论】:

            【解决方案10】:

            完美运行的 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
            } 
            

            【讨论】:

            • 使用 imageUrl 作为字符串
            • 和 tableview 单元格中的 alamofire 请求
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-11-30
            • 2015-08-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多