Lu7k7 / Firestore-in-UITableView

Afficher des données dans un UITableViewController depuis Firestore, mais surtout connaitre le nombre de documents pour définir le nombre de cellules a créer
0 stars 0 forks source link

UITableView #1

Open Akrasiaa opened 3 years ago

Akrasiaa commented 3 years ago

Hello,

Du coup le fonctionnement d'une UITableView est le suivant :

Il y a deux méthodes indispensables :

La première indique combien de cellule il y a dans une section. Et la deuxième est appelé X fois en fonction du résultat de la première. Donc si tu met 0 ce sera appelé 0 fois. Si tu mets 10, ce sera appelé 10 fois.

Tu as fetch les résultats de Firebase dans la seconde méthode. Donc tu vas fetch ces résultats X fois. (par chance le nombre de rows est de 1 donc ce sera appelé qu'une fois. Mais c'est vraiment pas la chose à faire.)

De ce que je comprends, tu as 2 sections, la première affiche une liste de soirées et la deuxième une liste d'amis. Donc tu peux faire quelque chose comme ça :

class TableViewController: UITableViewController {
    // Il manque une ref de la tableView
    @IBOutlet private weak var tableView: UITableView!

    // J'ai mis String au pif, il faudrait remplacer par ton objet
    var soirees = [String]

    /** J'ai laissé mais in fact il faudrait virer ce "double array". Utilise un objet pour représenter un ami
          struct Friend {
              var name: String
              var points: Int
          }

         let amis = [Friend(name: Arthur Dupoint, points: 100), Friend(...), ...]
    */
    let amis = [["Arthur Dupond", "100 Points"], ["Jean Bernard", "120 Points"], ["Jean bist", "120 Points"], ["Jean tra", "120 Points"]]   
    let ref = Firestore.firestore().collection("utilisateur").document("EJj1MzvzVMMVZPMkNTLyDMKlEK83")

    override func viewDidLoad() {
       // Le weak self permet d'éviter les fuites de mémoire
       ref.collection("soirées").getDocuments() { [weak self] (querySnapshot, err) in
                if let err = err {
                    print("Error getting documents: \(err)")
                } else {
                    for document in querySnapshot!.documents {
                        self?.soirees = document.data()
                        // reloadData fait que les méthodes delegates seront appelés de nouveau. Donc ta table sera actualisé.
                        self?.tableView.reloadData()
                    }
               }
    }    

   override func numberOfSections(in tableView: UITableView) -> Int {
               2
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
                if section == 0 {                        
                        return soirees.count
                } else if section == 1 {
                    return amis.count
               }  else {
                    return 0
               }
     }

        override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
                if indexPath.section == 0 {
                     let cell = tableView.dequeueReusableCell(withIdentifier: "soireeCell") as! AccueilCell
                    cell.nomSoireeLabel.text = soirees[indexPath.row].name
                    cell.nombreLabel.text = "\(soirees[indexPath.row].points) Points"   
                    return cell
               }  else {
                    let cell = tableView.dequeueReusableCell(withIdentifier: "soireeCell") as! AccueilCell
                    cell.nomSoireeLabel.text = amis[indexPath.row ].name
                    cell.nombreLabel.text = "\(amis[indexPath.row].points) Points"
                    return cell 
              }
Lu7k7 commented 3 years ago

Ah d'accord je vois très bien merci ! je viens d'essayer en le remettant un peu à ma sauce et ça marche parfaitement, merci de ton aide ;)