解析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上列出值并显示名称、年份、品牌和图片。如何通过?