如何将不同的图像解析到表视图可重用单元格中?

时间:2019-05-14 12:06:29

标签: ios swift uitableview

我在将图像解析到表视图可重用单元格时遇到麻烦。希望任何人都能提供帮助。抱歉,如果有太多的代码,只是不想错过什么。这是我的代码:

import UIKit

struct OfferList: Decodable {
    let data: [CarItems]
    let status: String
    let count: Int }

struct CarItems: Decodable {

    let id: String
    let image: URL
    let manufacturer: String
    let model: String
    let priceNet: Double
    let priceOld: Int
    let priceGross: Double
    let powerKw: String
    let powerPs: String
    let milage: String
    let fueltype: String }

class OfferVC: UIViewController {

    @IBOutlet weak var tableView: UITableView!

    var viewModels = [CarItems]()

    override func viewDidLoad() {
        super.viewDidLoad()

        let urlString = "http://grandex.de/api/v1/de/offers"
        guard let url = URL(string: urlString) else { return }

        URLSession.shared.dataTask(with: url) { (data, _, error) in
            if let error = error { print(error); return }

            do {
                let decoder = JSONDecoder()
                decoder.keyDecodingStrategy = .convertFromSnakeCase
                let result = try decoder.decode(OfferList.self, from: data!)
                self.viewModels = result.data
                DispatchQueue.main.async {
                    self.tableView.reloadData()
                }
            } catch {
                print(error)
            }
        }.resume()
    }
     }

extension OfferVC: UITableViewDelegate, UITableViewDataSource {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return viewModels.count
    }

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

        let cell = tableView.dequeueReusableCell(withIdentifier: "id") as! Cell
        let vm = viewModels[indexPath.row]
        cell.update(with: vm)
        return cell
    }

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 130
    } }

class Cell: UITableViewCell {

    @IBOutlet weak var carImage: UIImageView!
    @IBOutlet weak var title: UILabel!
    @IBOutlet weak var fueltype: UILabel!


    func update(with item: CarItems) {
        title?.text = item.manufacturer
        fueltype?.text = item.fueltype
        carImage?.image = item.image
    }

    func getImage(with item: CarItems){
        let session = URLSession(configuration: URLSessionConfiguration.default)

        guard let url = URL(string: "\(item.image)") else { return }

        var request = URLRequest(url: url)
        request.httpMethod = "GET"

        session.dataTask(with: request) { (data, response, error) in

            if let error = error {
                print("Something went wrong: \(error)")
            }

            if let imageData = data {
                DispatchQueue.main.async {
                    self.carImage.image = UIImage(data: data!)
                }
            }
        }.resume()
    } }

我希望它可以将图像添加到我的单元格中,但是它不起作用。 任何帮助将非常感激!预先感谢!

2 个答案:

答案 0 :(得分:1)

首先,在CarItems struct中,将image的类型设置为String而不是URL。您从String获得JSON,而不是URL类型。

update(with:)方法中,调用getImage(with:)方法,即

func update(with item: CarItems) {
    title?.text = item.manufacturer
    fueltype?.text = item.fueltype
    self.getImage(with: item) //Here..
}

此外,请使代码尽可能短。您可以将getImage(with:)方法缩减为:

func getImage(with item: CarItems){
    guard let url = URL(string: "\(item.image)") else { return }
    URLSession.shared.dataTask(with: url) {[weak self] (data, response, error) in
        if let data = data {
            DispatchQueue.main.async {
                self?.carImage.image = UIImage(data: data)
            }
        }
    }.resume()
}

答案 1 :(得分:0)

您可以简单地浏览我的视频来实现它,而无需使用数据任务。 https://youtu.be/A7ZTXrSxt_A