【问题标题】:I'm having troubles displaying an image from JSON in a Table View我在表格视图中显示来自 JSON 的图像时遇到问题
【发布时间】:2020-06-04 04:41:23
【问题描述】:

我正在尝试显示来自 API 的图像。图片在一个 URL 中,我想用所有数组填充一个表格视图,但它在表格视图中只显示一个图像。

这是我的代码:

   struct Autos {
        let Marca:String
        let Modelo:String
        let Precio:String
        let RutaImagen:String

    init?(_ dict:[String:Any]?){
        guard let _dict = dict,
            let marca=_dict["Marca"]as?String,
            let modelo=_dict["Modelo"]as?String,
            let precio=_dict["Precio"]as?String,
            let rutaImagen=_dict["RutaImagen"]as?String

            else { return nil }

        self.Marca = marca
        self.Modelo = modelo
        self.Precio = precio
        self.RutaImagen = rutaImagen
   }
}

  var arrAutos = [Autos]()

 func getImage(from string: String) -> UIImage? {
        // Get valid URL
        guard let url = URL(string: string)
            else {
                print("Unable to create URL")
                return nil
        }
    var image: UIImage? = nil
    do {
        // Get valid data
        let data = try Data(contentsOf: url, options: [])

        // Make image
        image = UIImage(data: data)
    }
    catch {
        print(error.localizedDescription)
    }

    return image
}

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
      let cell = tableView.dequeueReusableCell(withIdentifier: "carsCell", for: indexPath) as! CarsDetailTableViewCell
      let url = URL(string: "http://ws-smartit.divisionautomotriz.com/wsApiCasaTrust/api/autos")!

        let task = URLSession.shared.dataTask(with: url) {
            (data, response, error) in

            guard let dataResponse = data, error == nil else {
                print(error?.localizedDescription ?? "Response Error")
                return
            }

            do {
                let jsonResponse = try JSONSerialization.jsonObject(with: dataResponse, options: []) as? NSArray
                self.arrAutos = jsonResponse!.compactMap({ Autos($0 as? [String:String])})

                DispatchQueue.main.async {
                    // Get valid string
                    let string = self.arrAutos[indexPath.row].RutaImagen
                    if let image = self.getImage(from: string) {
                        // Apply image
                        cell.imgCar.image = image
                    }
                    cell.lblBrand.text = self.arrAutos[indexPath.row].Marca
                    cell.lblPrice.text = self.arrAutos[indexPath.row].Precio
                    cell.lblModel.text = self.arrAutos[indexPath.row].Modelo
                }

            } catch let parsingError {
                print("Error", parsingError)
            }
        }
        task.resume()

    return cell
}

JSON 序列化工作正常,因为其他数据在表格视图中正确显示,问题出在图像上,因为在表格视图中只出现一个图像,其他行是空的。有人有建议吗?

【问题讨论】:

    标签: json image uitableview ios11 swift5


    【解决方案1】:

    我认为您应该在加载 tableview 之前下载完整数据并在完成处理程序中重新加载 tableview。在您的viewDidLoad() 中调用loadData() 方法。

    fileprivate func loadData() {
    
        let url = URL(string: "http://ws-smartit.divisionautomotriz.com/wsApiCasaTrust/api/autos")!
    
        let task = URLSession.shared.dataTask(with: url) {
            (data, response, error) in
    
            guard let dataResponse = data, error == nil else {
                print(error?.localizedDescription ?? "Response Error")
                return
            }
    
            do {
                let jsonResponse = try JSONSerialization.jsonObject(with: dataResponse, options: []) as? NSArray
                self.arrAutos = jsonResponse!.compactMap({ Autos($0 as? [String:String])})
    
                DispatchQueue.main.async {
                    self.tableView.reloadData()
                }
    
            } catch let parsingError {
                print("Error", parsingError)
            }
        }
        task.resume()
    }
    

    要在tableView单元格中加载图像,请在background线程中下载图像,然后在main线程中更新imageView。

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "carsCell", for: indexPath) as! CarsDetailTableViewCell
    
            // Get valid string
        let string = self.arrAutos[indexPath.row].RutaImagen
            //print(string)
        cell.lblBrand.text = self.arrAutos[indexPath.row].Marca
        cell.lblPrice.text = self.arrAutos[indexPath.row].Precio
        cell.lblModel.text = self.arrAutos[indexPath.row].Modelo
        let url = URL(string: string)
        if url != nil {
            DispatchQueue.global().async {
                let data = try? Data(contentsOf: url!)
                DispatchQueue.main.async {
                    if data != nil {
                        cell.imgCar.image = UIImage(data:data!)
                    }
                }
            }
        }
        return cell
    }
    

    希望这会奏效。

    【讨论】:

      猜你喜欢
      • 2020-01-04
      • 2018-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-05
      • 2021-08-31
      相关资源
      最近更新 更多