Bonjour à tous,
Je suis dans un contexte où j’ajoute des produits à un panier. J’ai donc un UITableViewController pour mon panier et j’ai déclaré un Outlet pour ma tableview.
Jusque là, tout se passe bien, j’arrive à remplir ma table à chaque ajout de produit sans problème. Sauf que depuis mon panier, je veux pouvoir changer la quantité de chaque produit. Donc dans ma cellule, j’ai un UIStepper pour gérer la quantité. Pas de soucis de ce côté là non plus, les données se passent bien, et je print correctement mes nouvelles quantité.
Mais après avoir changé la quantité, je veux actualiser ma table pour avoir le bon chiffre et le bon total. Et là …
J’ai une fonction updateDisplay() (qui fonctionne bien dans tout le processus de base) :
func updateDisplay() {
self.uiCartTableView.reloadData()
refreshControl?.endRefreshing()
}
Comme je le disais donc, cette fonction est appelée plusieurs fois dans mon processus et ne pose pas de soucis. Mais quand j’appuie sur le stepper, j’ai cette erreur :
fatal error: unexpectedly found nil while unwrapping an Optional value
Il faut savoir que le tap sur le stepper appelle une fonction qui est à l’intérieur de mon UITableViewController. Et c’est cette fonction qui appelle le updateDisplay.
Donc, si vous savez pourquoi mon self.uiCartTableView est à Nil à ce moment là, je suis preneur.
Merci
Je ne sais pas trop pourquoi tu as ce problème, mais ce que je peux te dire c’est que si tu utilises un UITableViewController, tu n’as pas besoin de créer un outlet pour ta table view, tu as déjà une variable self.tableView
disponible dans les UITableViewController
Si tu as le même problème avec cette variable, il faudrait que tu nous montres comment tu as relié ton stepper à cette fonction et comment cette fonction appelle le updateDisplay()
Merci pour ta réponse Maxime @mbritto
Donc j’ai remplacé mon self.uiCartTableView.reloadData() par self.tableView.reloadData().
Plus de crash de l’appli pour une valeur à nil.
Mais pour autant, mes données ne se rechargent pas…
Voici donc comment est construit mon programme :
// CartTableViewCell.swift
@IBAction func uiCartQuantityChangeAction() {
let quantity = Int(self.uiCartQuantityStepper.value)
self._cartTableViewController.changeQuantity(id: _id, quantity: quantity)
}
// CartTableViewController.swift
func changeQuantity(id:Int, quantity:Int) {
// Code pour changer la quantité dans mon panier (fonctionne sans soucis)
updateDisplay()
}
Et donc, toujours dans CartTableViewController.swift :
func updateDisplay() {
self.tableView.reloadData()
refreshControl?.endRefreshing()
}
Tu peux ajouter ta fonction qui crée les cellules dans ton contrôleur ?
Je suis inquiet pour cette variable _cartTableViewController qui pourrait ne pas avoir la bonne valeur
Et voici (ce n’est sûrement pas parfait, j’essaye des choses pour le moment ) :
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: reuseIdentifier, for: indexPath) as! CartTableViewCell
// Configure the cell...
let id = Array(self._cart.keys)[indexPath.row]
if let index = self._cart.index(forKey: id) {
let value = self._cart[index].value
if let productIndex = value.first {
let quantity = productIndex.key
let product = productIndex.value
// Set product ID
cell._id = id
// Set product name
cell.uiCartProductNameLabel.text = product[0].name
// Set product quantity
cell.uiCartProductQuantityLabel.text = String(quantity)
cell.uiCartQuantityStepper.value = Double(quantity)
// Set product total
let price = product[0].price
let productTotal = price * Double(quantity)
cell.uiCartSubTotalLabel.text = String(productTotal) + " €"
}
}
return cell
}
De fait, je vois ce que tu veux dire.
Pour info, et c’est peut-être là que ça ne passe pas, cette variable est instanciée dans ma cellule :
let _cartTableViewController: CartTableViewController = UIStoryboard(name: « Main », bundle: nil).instantiateViewController(withIdentifier: « CartTableViewController ») as! CartTableViewController
Ah ben voilà, tu crée une nouvelle instance de ton contrôleur au lieu de lui passer le véritable contrôleur.
Il faut que tu passes self depuis la fonction cellForRow à ta cellule. La cellule ne doit pas créer un nouveau contrôleur mais recevoir l’existant. Sinon elle va communiquer avec ce nouveau contrôleur (qui n’est pas visible) alors que tu veux mettre à jour les valeurs dans le contrôleur initial.
Et oui … Forcément !
Merci @mbritto c’est tout bon
1 « J'aime »