我在将图像解析到表视图可重用单元格时遇到麻烦。希望任何人都能提供帮助。抱歉,如果有太多的代码,只是不想错过什么。这是我的代码:
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()
} }
我希望它可以将图像添加到我的单元格中,但是它不起作用。 任何帮助将非常感激!预先感谢!
答案 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