Salut les Codeurs, en ce dimanche je continue à agrémenter mon application de diverses fonctions.
J’essaye d’afficher dans un UITableViewCell les données extraite avec Alamofire, mais je ne sais pour quelle raison cela ne veut pas fonctionner.
Je vous poste le lien du controller sur GitHub comme ça cela permet de voyager dans le code.
//
// WeatherProController.swift
// MeteoWapi
//
// Created by Jean-François Coquerelle on 14/06/18.
// Copyright © 2018 Jean-François Coquerelle. All rights reserved.
//
import UIKit
import Alamofire
import MapKit
class WeatherProController: UIViewController, CLLocationManagerDelegate, UITableViewDataSource,UITableViewDelegate {
var datas = [WeatherProData]()
var locManager = CLLocationManager()
var currentLocation: CLLocation!
let identifiantCell = "dataProCell"
let identifiantSegue = "versDetailDonneePro"
This file has been truncated. show original
Je vous remercie pour vos lumières
Les print fonctionnes j’ai bien l’information qui remonte dans le console, mais impossible de l’afficher dans ma tableview
Hello,
Tu as dans ton code, une fonction data()
func data () {
//
}
Et dans le code un moment tu fais ceci :
let data = datas[indexPath.row]
Peut être que ça s’écrase au niveau de la memoire, que cela fait un conflit.
Egalement, la méthode data()
qui appel Alamo, est asynchrone, et donc meme si tu l’appelle pendant le willAppear, la réponse tu l’as après.
Peut être devrais tu faire un tableView.reloadData()
https://developer.apple.com/documentation/uikit/uitableview/1614862-reloaddata
J’ai modifier un peu, comme toujours les Print donnes les informations mais je n’arrive pas à compléter la tableview
import UIKit
import Alamofire
import MapKit
class WeatherProController: UIViewController, CLLocationManagerDelegate, UITableViewDataSource,UITableViewDelegate {
var datas = [WeatherProData]()
var locManager = CLLocationManager()
var currentLocation: CLLocation!
let identifiantCell = "dataProCell"
let identifiantSegue = "versDetailDonneePro"
@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var menuButton: UIBarButtonItem!
@IBOutlet weak var label: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
locManager.requestAlwaysAuthorization()
if ( CLLocationManager.authorizationStatus() == .authorizedWhenInUse ||
CLLocationManager.authorizationStatus() == .authorizedAlways) {
currentLocation = locManager.location
}
var headers: HTTPHeaders = [
"Content-Type": "application/json"
]
let user = loginWeatherPro
let password = motDePasseWeatherPro
if let authorizationHeader = Request.authorizationHeader(user: user, password: password) {
headers[authorizationHeader.key] = authorizationHeader.value
}
let now = Date()
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ"
formatter.calendar = Calendar(identifier: .iso8601)
formatter.timeZone = TimeZone.init(abbreviation: "UTC")
formatter.locale = Locale(identifier: "en_US_POSIX")
print(formatter.string(from: now))
let days = Calendar.current.date(byAdding: .day, value: 15, to: now)
// print(formatter.string(from: days!))
let urlB = urlDeBaseWeatherPro
let locate = "locatedAt=\(currentLocation.coordinate.longitude),\(currentLocation.coordinate.latitude)"
let period = "&validPeriod=PT0S"
let validFrom = "&validFrom=\(formatter.string(from: now))"
let validUntil = "&validUntil=\(formatter.string(from: days!))"
let fields = "&fields=" + fieldsParameter
let url = urlB + locate + period + validFrom + validUntil + fields
print(url)
Alamofire.request(url, headers:headers).responseJSON{ response in
if let JSON = response.result.value as? [String: AnyObject] {
if let forecast = JSON ["forecasts"] as? NSArray {
for element in forecast {
if let dict = element as? [String: AnyObject]{
if let dates = dict ["validFrom"] as? String {
print(DateHelper.obtenir.jourDeLaSemaineWeather(dates)! + " " + dates + (DateHelper.obtenir.heures(dates))! as Any)
self.datas.append(WeatherProData(date: dates))
if let temp = dict ["airTemperatureInCelsius"] as? Double {
print(temp)
if let pressur = dict ["airPressureAtSeaLevelInHectoPascal"] as? Double {
print(pressur)
}
}
}
}
}
}
}
}
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return datas.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if let cell = tableView.dequeueReusableCell(withIdentifier: identifiantCell) as? WeatherProCell {
let data = datas[indexPath.row]
cell.creerCell(data)
return cell
}
return UITableViewCell()
}
}
gaveline:
Egalement, la méthode qui appel Alamo, est asynchrone, et donc meme si tu l’appelle pendant le willAppear, la réponse tu l’as après.
Peut être devrais tu faire un tableView.reloadData()
reloadData() | Apple Developer Documentation
Je ne vois toujours pas de reloadData()
As tu essayé ça ?
@JefNewTech
Salut,
Comme a peu te le proposer @gaveline , ton traitement de récupération des données est de manière ASYNC. Donc ta tableview est affiché avant de récupérer les données dans ta variable DATAS. Puisque ta requête peut dépendre de ta connexion internet ou bien le site à envoyer la réponse.
Donc un reload de ta table view peu effectivement faire apparaitre des données.
Merci pour vos réponses, j’ai remanier un peut le code maintenant ça fonctionne.