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
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
}
Hello,
Du coup le fonctionnement d'une
UITableView
est le suivant :Il y a deux méthodes indispensables :
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
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 vasfetch
ces résultats X fois. (par chance le nombre derows
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 :