解析jSON数据后,使用swif发送另一个viewController并加载UITableViewCell

解析jSON数据后,使用swif发送另一个viewController并加载UITableViewCell,json,swift,Json,Swift,我已经在DataManager.swift上成功下载了JSON数据。下载数据后,我想将其存储到数组或字典中,**“listings”**值并将其发送到ViewController.swift并将其加载到UITavleViewCell中。我遵循MVC框架。我试过几种方法,但都失败了 JSON数据 { "backfillCount": 150, "breadCrumbs": [ {3 items}, {3 items}, {3 items} ], "

我已经在
DataManager.swift
上成功下载了JSON数据。下载数据后,我想将其存储到数组或字典中,
**“listings”**
值并将其发送到
ViewController.swift
并将其加载到UITavleViewCell中。我遵循MVC框架。我试过几种方法,但都失败了

JSON数据

{
"backfillCount": 150,
"breadCrumbs": [
{3 items},
{3 items},
{3 items}
],
"dealerNewCount": 420,
"dealerUsedCount": 319,
"enhancedCount": 589,
"facetCountMap": {25 items},
"listings": [
{
"accidentHistory": {4 items},
"advantage": true,
"backfill": false,
"badge": "GREAT",
"bedLength": "Unspecified",
"bodytype": "Sedan",
"cabType": "Unspecified",
"certified": false,
"currentPrice": 31985,
"dealer": {21 items},
"dealerType": "NEW",
"displacement": "2.4 L",
"distanceToDealer": 4.410725307988554,
"drivetype": "FWD",
"engine": "4 Cyl",
"exteriorColor": "Blue",
"firstSeen": "2019-12-12",
"followCount": 5,
"following": false,
"fuel": "Gasoline",
"hasViewed": false,
"id": "19UUB1F69LA000169CDOTUSNR4120191212",
"imageCount": 25,
"images": {5 items},
"interiorColor": "Red",
"isEnriched": false,
"listPrice": 31985,
"make": "Acura",
"mileage": 1550,
"model": "TLX",
"monthlyPaymentEstimate": {7 items},
"mpgCity": 23,
"mpgHighway": 32,
"newTopOptions": [10 items],
"noAccidents": true,
"oneOwner": true,
"onePrice": 33640,
"onePriceArrows": [4 items],
"onlineOnly": false,
"ownerHistory": {4 items},
"personalUse": true,
"recordType": "ENHANCED",
"sentLead": false,
"serviceHistory": {5 items},
"serviceRecords": true,
"sortScore": 191.65,
"stockNumber": "H200327A",
"subTrim": "Unspecified",
"topOptions": [10 items],
"transmission": "Automatic",
"trim": "Technology",
"vdpUrl": "https://www.carfax.com/vehicle/19UUB1F69LA000169",
"vehicleCondition": "Used",
"vehicleUseHistory": {4 items},
"vin": "19UUB1F69LA000169",
"year": 2020
},
{56 items},
{56 items},
{56 items},
{57 items},
{56 items},
{56 items},
{56 items},
{56 items},
{56 items},
{56 items},
{56 items},
{56 items},
{56 items},
{56 items},
{56 items},
{56 items},
{57 items},
{56 items},
{56 items},
{56 items},
{56 items},
{56 items},
{56 items},
{56 items}
],
"page": 1,
"pageSize": 25,
"relatedLinks": {2 items},
"searchArea": {8 items},
"searchRequest": {8 items},
"seoUrl": "Used-Acura_m1",
"totalListingCount": 739,
"totalPageCount": 30
}
下载管理器

import Foundation


protocol CarDataManagerDelegate {
    func didUpdateData()
    func didFailWithError(error: Error)
}

struct DataManager{
    var delegate:CarDataManagerDelegate?
        
    //MARK: - Fetch Car information
    func fetechCarInformation(){
        let urlString = "URL"
        performRequest(with: urlString)
    }
    
    //MARK: - Perform API Request From carfax-for-consumers
    func performRequest(with urlString: String){
        // create a URL
        if let url = URL(string: urlString){
            
            // create url session
            let session = URLSession(configuration: .default)
            
            // Give the session task
            let task = session.dataTask(with: url) { (data, response, error) in
                if error != nil{
                    print(error!)
                    //self.delegate?.didFailWithError(error: error!)
                    return
                }
                if let safeData = data{
                    self.parseJSON(carData: safeData)
                }
            }
            // start task
            task.resume()
        }
    }
    
    func parseJSON(carData: Data){
        let decoder = JSONDecoder()
        do {
            let decodedData = try decoder.decode(CarsFeed.self, from: carData)
           print(decodedData)
        } catch {
            print("MY Error: \(error)")
        }
    }
}
import UIKit

class ViewController: UIViewController {

    var dataManager = DataManager()
    
    @IBOutlet weak var carInfoTable: UITableView!
    
  
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        dataManager.delegate = self
        
        dataManager.fetechCarInformation()
        
        //MARK: - calling setUpTableView Function
        setupTableView()
    }
    
    //MARK: - Setup or Register UItableView
    
    func setupTableView() {
        carInfoTable.dataSource = self
        carInfoTable.register(UINib(nibName: K.cellNibName, bundle: nil), forCellReuseIdentifier: K.cellReuseIdentifier)
        carInfoTable.separatorStyle = .none
        carInfoTable.contentInsetAdjustmentBehavior = .never
        carInfoTable .reloadData()
    }
}

//MARK: - UITextFieldDelegate
extension ViewController: UITableViewDataSource{
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return pictures.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = carInfoTable.dequeueReusableCell(withIdentifier: K.cellReuseIdentifier, for: indexPath) as! CarInfoTableViewCell
        cell.cinfigureCell(picture: pictures[indexPath.row], title: titles[indexPath.row], mobileNumber: numbers[indexPath.row])
        return cell
    }
    
}

//MARK: - CarDataManagerDelegate
extension ViewController: CarDataManagerDelegate{
    func didUpdateData() {
        
    }
    func didFailWithError(error: Error) {
        
    }
    
}
型号

import Foundation

struct CarData: Decodable{
    let seoUrl: String
    let totalListingCount: Int
    let listings: [Listings]
    let picture:[Listings]
}

struct SearchArea: Decodable {
    let city: String
}

struct DealerNewCount: Decodable {
    let dealerNewCount: Int
}


struct Listings: Decodable {
    let badge: String
}
视图控制器

import Foundation


protocol CarDataManagerDelegate {
    func didUpdateData()
    func didFailWithError(error: Error)
}

struct DataManager{
    var delegate:CarDataManagerDelegate?
        
    //MARK: - Fetch Car information
    func fetechCarInformation(){
        let urlString = "URL"
        performRequest(with: urlString)
    }
    
    //MARK: - Perform API Request From carfax-for-consumers
    func performRequest(with urlString: String){
        // create a URL
        if let url = URL(string: urlString){
            
            // create url session
            let session = URLSession(configuration: .default)
            
            // Give the session task
            let task = session.dataTask(with: url) { (data, response, error) in
                if error != nil{
                    print(error!)
                    //self.delegate?.didFailWithError(error: error!)
                    return
                }
                if let safeData = data{
                    self.parseJSON(carData: safeData)
                }
            }
            // start task
            task.resume()
        }
    }
    
    func parseJSON(carData: Data){
        let decoder = JSONDecoder()
        do {
            let decodedData = try decoder.decode(CarsFeed.self, from: carData)
           print(decodedData)
        } catch {
            print("MY Error: \(error)")
        }
    }
}
import UIKit

class ViewController: UIViewController {

    var dataManager = DataManager()
    
    @IBOutlet weak var carInfoTable: UITableView!
    
  
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        dataManager.delegate = self
        
        dataManager.fetechCarInformation()
        
        //MARK: - calling setUpTableView Function
        setupTableView()
    }
    
    //MARK: - Setup or Register UItableView
    
    func setupTableView() {
        carInfoTable.dataSource = self
        carInfoTable.register(UINib(nibName: K.cellNibName, bundle: nil), forCellReuseIdentifier: K.cellReuseIdentifier)
        carInfoTable.separatorStyle = .none
        carInfoTable.contentInsetAdjustmentBehavior = .never
        carInfoTable .reloadData()
    }
}

//MARK: - UITextFieldDelegate
extension ViewController: UITableViewDataSource{
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return pictures.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = carInfoTable.dequeueReusableCell(withIdentifier: K.cellReuseIdentifier, for: indexPath) as! CarInfoTableViewCell
        cell.cinfigureCell(picture: pictures[indexPath.row], title: titles[indexPath.row], mobileNumber: numbers[indexPath.row])
        return cell
    }
    
}

//MARK: - CarDataManagerDelegate
extension ViewController: CarDataManagerDelegate{
    func didUpdateData() {
        
    }
    func didFailWithError(error: Error) {
        
    }
    
}

更改委托
didUpdateData
,如下所示

protocol CarDataManagerDelegate {
    func didUpdateData(_ carData: CarData)
    func didFailWithError(error: Error)
}
func parseJSON(carData: Data){
    let decoder = JSONDecoder()
    do {
        let decodedData = try decoder.decode(CarData.self, from: carData)
        self?.delegate?.didUpdateData(decodedData)
    } catch {
        print("MY Error: \(error)")
    }
}
现在从DataManager中传递
cardData
,如下所示

protocol CarDataManagerDelegate {
    func didUpdateData(_ carData: CarData)
    func didFailWithError(error: Error)
}
func parseJSON(carData: Data){
    let decoder = JSONDecoder()
    do {
        let decodedData = try decoder.decode(CarData.self, from: carData)
        self?.delegate?.didUpdateData(decodedData)
    } catch {
        print("MY Error: \(error)")
    }
}
现在,在您的
ViewController
中引入一个
CarData
属性,按如下所示从委托方法进行设置,然后重新加载
tableView

class ViewController: UIViewController {

    var dataManager = DataManager()
    
    private var carData: CarData?

    @IBOutlet weak var carInfoTable: UITableView!
    
  
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        dataManager.delegate = self
        
        dataManager.fetechCarInformation()
        
        //MARK: - calling setUpTableView Function
        setupTableView()
    }
    
    //MARK: - Setup or Register UItableView
    
    func setupTableView() {
        carInfoTable.dataSource = self
        carInfoTable.register(UINib(nibName: K.cellNibName, bundle: nil), forCellReuseIdentifier: K.cellReuseIdentifier)
        carInfoTable.separatorStyle = .none
        carInfoTable.contentInsetAdjustmentBehavior = .never
        carInfoTable .reloadData()
    }
}

//MARK: - UITextFieldDelegate
extension ViewController: UITableViewDataSource{
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.carData?.pictures.count ?? 0
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = carInfoTable.dequeueReusableCell(withIdentifier: K.cellReuseIdentifier, for: indexPath) as! CarInfoTableViewCell
        cell.cinfigureCell(picture: self.carData!.pictures[indexPath.row], title: titles[indexPath.row], mobileNumber: numbers[indexPath.row])
        return cell
    }
    
}

//MARK: - CarDataManagerDelegate
extension ViewController: CarDataManagerDelegate {

    func didUpdateData(_ carData: CarData) {
        self.carData = carData
        DispatchQueue.main.async {
            self.carInfoTable.reloadData()
        }
    }

    func didFailWithError(error: Error) {
        
    }
    
}

你在正确的轨道上,但你没有说你的确切问题是什么。到目前为止,我看到的主要问题是您没有在
didUpdateData
方法中传递新数据。@RobertCrabtree我传递数据的问题。例如在UITableViewCell上列出值并显示名称、年份、品牌和图片。如何通过?