Petit problème UITableViewCell


#1

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.

Je vous remercie pour vos lumières


#2

Les print fonctionnes j’ai bien l’information qui remonte dans le console, mais impossible de l’afficher dans ma tableview :no_mouth:


#3

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


#4

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()
}

}


#5

Je ne vois toujours pas de reloadData()
As tu essayé ça ?


#6

@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.


#7

Merci pour vos réponses, j’ai remanier un peut le code maintenant ça fonctionne.