Разбирать данные в табличном виде по alamofire в Swift3

Я хочу проанализировать данные в tableviewcontroller, но он ничего не отображает

это данные веб-сервиса:

Я хочу получить доступ к заголовку, img_url и price_formatted внутри ключа "списки"

пользователь вводит название города и тип дома, который он ищет, и я сохраняю эти значения с помощью userdefaults и получаю их в PropertySearchViewController.

Это мой код, использующий almofire для отображения этих значений:

У меня есть PropertySearchViewController, который отображает значения внутри него, PropertyTableViewCell и публичную модель Property

1-

class PropertySearchViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    let URL_Get_Data = "https://api.nestoria.co.uk/api?"


    @IBOutlet weak var tableViewProperty: UITableView!

    var properties = [Property]()

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

    public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! PropertyTableViewCell
        let property :Property
        property = properties[indexPath.row]
        cell.propertyTitle.text = property.title
        cell.propertyPrice.text = property.price
        if property.imageUrl != nil {

        Alamofire.request(property.imageUrl!).responseImage { response in
            debugPrint(response)

            if let image = response.result.value {
                cell.propertyImage.image = image
            }
            else{
                print("no image")
            }
            }}
        return cell
    }


       override func viewDidLoad() {
        super.viewDidLoad()

            //fetching data from web api
        //recieve data
        let city :String = UserDefaults.standard.string(forKey: "city")!

        let type :String = UserDefaults.standard.string(forKey: "typeP")!

        print("search values are :",city,type)
        let params: [String: String] = ["encoding": "json", "pretty": "1", "action": "search_listings", "country": "uk", "listing_type": type, "place_name": city]


        //end


//        
        Alamofire.request(URL_Get_Data, method: .get, parameters: params, encoding: URLEncoding.default, headers: nil).validate(statusCode: 200..<600).responseJSON {
//        Alamofire.request(URL_Get_Data).responseJSON {
            response in

//            response in
            //getting json
            if let json = response.result.value {
                print(type(of: json))
                //converting json to NSArray

                let propertyArray = json as! NSDictionary

                //traversing through all elements of the array
                for i in 0..<propertyArray.count{

                    //adding hero values to the hero list
                    self.properties.append(Property(
                        title: (propertyArray[i] as AnyObject).value(forKey: "title") as? String,
                        price: (propertyArray[i] as AnyObject).value(forKey: "price_formatted") as? String,
                        imageUrl: (propertyArray[i] as AnyObject).value(forKey: "imageUrl") as? String
                    ))

                }

                //displaying data in tableview
                self.tableViewProperty.reloadData()
            }
        }

    }}

// конец PropertySearchViewController

2-

class PropertyTableViewCell: UITableViewCell {

    @IBOutlet weak var propertyImage: UIImageView!
    @IBOutlet weak var propertyTitle: UILabel!
    @IBOutlet weak var propertyPrice: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}
//end

3-

class Property{
    var title: String?
    var price: String?
    var imageUrl: String?

    init(title: String?, price: String?, imageUrl: String?) {
        self.title = title
        self.price = price
        self.imageUrl = imageUrl
    }


}

заранее спасибо

1 ответ

(1) Установить модуль SwiftyJSON

(2) import SwiftyJSON в PropertySearchViewController

(3) Добавить let reuseIdentifierResultTable = "cell" ниже let URL_Get_Data = "url"

(4) Добавить в viewDidLoad()
tableViewProperty.register(PropertyTableViewCell.self, forCellReuseIdentifier: reuseIdentifierResultTable)
tableViewProperty.delegate = self
tableViewProperty.dataSource = self

(5) Заменить все в .responseJSON{} с

    response in

    if let data = response.data {
        let json = String(data: data, encoding: String.Encoding.utf8)
        //print(json)
        if let dataFromString = json?.data(using: .utf8, allowLossyConversion: false) {
            let json2 = JSON(data: dataFromString)

            print("Response: \(json2)")

            print("json status code: \(json2["response"]["status_code"])")

            if json2["response"]["status_code"] == "200" && !(json2.null != nil){

                print("json request count: \(json2["request"].count)")
                print("json response count: \(json2["response"].count)")
                print("json response listings count: \(json2["response"]["listings"].count)")

                for i in 0...json2["response"]["listings"].count-1 {
                    print("\(i). \(json2["response"]["listings"][i]["title"])")
                    self.properties.append(Property(
                        title: json2["response"]["listings"][i]["title"].rawString()!,
                        price: json2["response"]["listings"][i]["price_formatted"].rawString()!,
                        imageUrl: json2["response"]["listings"][i]["img_url"].rawString()!
                    ))
                }
            }
        }
        self.tableViewProperty.reloadData()
    }

(6) Заменить
public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{ if properties.count < 1 { return 0 } return properties.count }

(7) Заменить

let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! PropertyTableViewCell


с

let cell = Bundle.main.loadNibNamed("PropertyTableViewCell", owner: self, options: nil)?.first as! PropertyTableViewCell

(8) Заменить
cell.propertyTitle.text = property.title! cell.propertyPrice.text = property.price!

Другие вопросы по тегам