Разбирать данные в табличном виде по 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!