使用UITableView Cell的Swift 4 AlamofireImage

问题描述 投票:10回答:10

我正在使用Alamofire Images尝试从服务器下载图像并将其显示在我的表视图单元格中,这是我得到的,但我的图像没有出现,只有文本Label和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
    }
ios swift uitableview alamofire alamofireimage
10个回答
1
投票

试试这个:

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

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


0
投票

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
} 

4
投票

当然,您的图片不会显示给您。因为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


0
投票

您可以使用SDWebImage

首先你需要导入它

import SDWebImage

然后你可以使用这种方法

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

0
投票

Using 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
投票

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


0
投票

首先你必须检查,如果你得到了反应,你得到了正确的答案,而不是写代码

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

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

0
投票

这对我有所帮助:

首先创建此功能以帮助下拉图像。如果您正在提取多个图像,您可能需要创建一个新的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
}

然后你很高兴去。


0
投票

您应该将链接作为变量传递给单元格中的变量,并覆盖UITableViewCell中的awakefromnib函数。在awakeFrom nib内部,您调用alamofire请求以在单元格中加载图像,这样您每次重用单元格时都不会调用查询。

所以

// 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
投票

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

DispatchQueue.main.async {
    cell.imageView?.image = image
}
© www.soinside.com 2019 - 2024. All rights reserved.