Ajouter des Section dans un UITableView


#41

Pour la vérification de la date, elle est faite après au moment de :

if data.date == self.sections[index] {
      self.dateSection[index].append(data)
}

Là, il regarde si la date qui fait office de titre dans ta section est celle de WeatherData et si c’est le cas, il vient alimenter les cellules.
Il y a donc maintenant à travailler sur le data qui doit contenir les données que tu veux afficher et tu dois aussi créer une cellule dédiée si jamais tu veux faire un affichage particulier.


#42

D’accord tu m’a fait un pull request pour le code des section et des dates ?


#43

Ça ferait quelque chose comme ça.

J’ai codé ça à l’arrache, il faudrait passer un peu plus de temps dessus pour gérer tous les cas possibles.


#44

C’est déjà sympa de ta part , mais je crois que pour un débutant je me suis attaqué à quelques chose de complexe !

Car il faut trier les cellules selon la date et mettre dans chaque section appropriée.

De plus je constate que les heures apparaisse parfois deux fois


#45

Oui, ça se fait très bien de trier les données avec un sort() et après, je ne sais pas quel type de données redescend de WeatherPro. Là, il y a juste la date mais il y a certainement moyen de faire en sorte de récupérer tout ce que l’API peut t’envoyer.

Je te mets le code modifié ici car j’ai pas fait de pull mais un download de ton projet.

         Alamofire.request(url, headers:headers).responseJSON { response in
            if let JSON = response.result.value as? [String: Any] {
                if let forecast = JSON ["forecasts"] as? NSArray {
                    for element in forecast {
                        if let dict = element as? [String: Any],
                            let dates = dict ["validFrom"] as? String {
                            self.data.append(WeatherProData(date: dates))
                            self.sections = Array(Set(self.data.map({ (WeatherProData) -> String in
                                let jsonDateString = WeatherProData.date
                                let dateFormatter = DateFormatter()
                                dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssXXX"
                                if let weatherProDataDate = dateFormatter.date(from: jsonDateString) {
                                    return french.string(from: weatherProDataDate)
                                } else {
                                    return ""
                                }
                            })))
                            self.sections.forEach({ (string) in self.dateSection.append([])})
                            for index in 0..<self.sections.count {
                                self.data.forEach({ (data) in
                                    let jsonDateString = data.date
                                    let dateFormatter = DateFormatter()
                                    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssXXX"
                                    let frenchDate:String
                                    if let weatherProDataDate = dateFormatter.date(from: jsonDateString) {
                                        frenchDate = french.string(from: weatherProDataDate)
                                    } else {
                                        frenchDate = ""
                                    }
                                    if frenchDate == self.sections[index] {
                                        self.dateSection[index].append(data)
                                    }
                                })
                            }
                            self.tableView.reloadData()
                        }
                    }
                }
            }
        }

Et pour la partie mise en forme de la cellule (codée à l’arrache)

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
//        let datas = data[indexPath.row]
        let dateString = dateSection[indexPath.section] [indexPath.row].date
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssXXX"
        let date = dateFormatter.date(from: dateString)
        dateFormatter.dateFormat = "HH:mm"
        let time = dateFormatter.string(from: date!)
        cell.textLabel?.text = time
//        cell.textLabel?.text = datas.date
        self.tableView.addSubview(self.refreshControl)
        return cell
        
    }

#46

ok je te remercie de ton aide

En faite dans chaque section il remet toutes les données de toutes les cellules donc si je prend les données pour 10 jours, jai 10 sections mais dans les 10 sections j’ai mes 10 dates + 24 h dans chaque section soit 34 cellules dans chaque section


#47

Ok, donc il faut que tu fasses un check au moment de venir remplir tes cellules, que le titre de la section (qui est une date) soit égal à la date qui est dans la donnée de WeatherPro.
Comme ça tu auras les bonnes données au bon endroit en fonction de la date.
Ce que je t’ai envoyé c’est vite fait, je n’ai pas pris le temps de faire tous les checks :wink:


#48

Ok pour ça je vais devoir chercher dans les cours car je ne voie pas du tout comment on fait


#49

Oui, tu trouveras pas mal d’informations dans les cours sur les TableView.
Et notamment sur comment faire des cellules personnalisées.
Ce sont des notions que l’on utilise quasiment en permanence dans le développement iOS.


#50

Les cellule personnalisées je sais déjà faire car j’ai fait mon application météo sur mon github

L’application test que je fait ici et justement pour aller embellir mon application météo car je n’arrivais pas à mettre mes sections en place et comme je ne voulais pas faire trop de chipotage dans ce qui fonctionne déjà bien j’ai décidé de créer AppliTest.

En même temps cela me permettra d’essayer plusieurs chose et aller ensuite les inclures dans l’application météo :blush:


#51

Je m’excuse de revenir sur ce sujet, mais comment je peux faire pour afficher les heures correspondante au jour sous la section du jour car je ne trouve rien qui me parle sur le net

ou alors je ne trouve pas le bon terme de fonction

merci


#52

Au moment de construire ta cellule, tu lui dis que si le titre de la section est égal à la date d’aujourd’hui alors tu crées les cellules en conséquence avec les données qui viennent de WeatherPro.


#53

Donc c’est bien avec une condition if else


#54

Tout à fait, ça sera quelque chose comme

if (dateSection[indexPath.section] == french.string(from: WeatherProDataDate) {
     let dateString = dateSection[indexPath.row].date

     // Convert date in time

     cell.textLabel?.text = time
}

Il faut tout adapter évidemment, ce n’est qu’un exemple mais c’est pour te donner une idée.


#55

D’accord merci pour ton aide je vais regarder à cela :+1:

Je dois bien mettre ça dans mon cellForRowAt ? pour la creation de la cellule


#56

Tout à fait, dans cette fonction là :

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "identifier", for: indexPath)
        return cell
    }

#57

Ne veut pas s’appliquer je ne voie pas pourquoi puisqu’il fonctionne plus haut dans le code


#58

Parce que ce n’est pas une fonction à part entière, tu l’as déclaré dans le ViewDidLoad() de mémoire donc tu ne peux pas l’utiliser dans le cellForRowAt car il ne le “connaît” pas.
Je te conseille quand même de suivre attentivement tous les cours de Maxime sur le swift, ça va te permettre d’y voir plus clair pour avancer plus sereinement !


#59

Merci je suis effectivement occupé à passer en revue le cours de Maxime :wink:

Merci pour ton aide :pray:


#60

Bonjour, je vais passer pour un bête mais je n’y arrive toujours pas.
Je n’arrive pas modifier les lignes ci-dessous pour que cela fonctionne

Je me doute que ca doit être la base mais j’ai re-visionné les vidéos sans avoir réponses à mes interrogations

if (dateSection[indexPath.section] == french.string(from: WeatherProDataDate) {
let dateString = dateSection[indexPath.row].date

 // Convert date in time

 cell.textLabel?.text = time

}