Problème d'affichage d'un tableau dans une TableView

Bonjour,

J'ai un problème d'affichage de mon [String] dans une TableView, je vous montre :

Avant la page ci-dessous il y a un TableViewController qui contient une marque différente dans chaque case

Quand l'on appuie sur par exemple RS3 ou RS4 etc... :

Pour chaque modèle ( rs3, rs4 etc..) le 0 s'affiche dans la première cellule au lieu du nom du modèle

Le tableau est défini comme ceci :

var Marques: [Marque] = [

        Marque(nom: "AUDI",modele:["0","RS3","RS4","RS5","RS6","RS7","R8"], image: "logo-audi", imageVoiture: [""], like: false),

Le code que j'ai écrit pour essayer d'afficher le nom du modèle :

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        switch indexPath.row {

        case 0:

            let cell = tableView.dequeueReusableCell(withIdentifier: "ModeleInfoNom", for: indexPath) as! ModeleInfoTableViewCell
            cell.ModeleInfoNomLabel.text = ModeleInfo.modele[indexPath.row]

            return cell

Ce que j'aimerai faire c'est mettre le nom du modèle dans chaque cellule qui va bien, si je clique sur rs3 à la place du 0 il faut qu'il y a écrit rs3, si je clique sur rs4 à la place du 0 il faut qu'il y a écrit rs4

Merci de votre aide

Answered by Claude31 in 699852022

Vous avez un décalage entre le numéro de cellule et le dataSource. ici, la cellule zero devrait contenir l'élément du bon modèle. Et son numéro doit être passé en paramètre quand vous cliquez sur la cellule de la premiere vue.

Je ne comprends pas pourquoi vous avez un tableView dans la seconde view…

Comment passez vous à la seconde view ? Comment avez vous défini le segue (avec son ID SegueToInfos) pour aller à la seconde vue ?

La façon classique de le faire :

  • dans la 1ere class, définissez le segue pour aller à la seconde view

créez la fonction :

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

dans laquelle vous appellerez perform (segue …) créez la fonction prepare dans laquelle vous allez passer le paramètre à la seconde view:

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    }

Vous utilisez alors ce paramètre dans le seconde vue.

Pour être plus précis, il faut que vous montriez le code des 2 class.

Accepted Answer

Vous avez un décalage entre le numéro de cellule et le dataSource. ici, la cellule zero devrait contenir l'élément du bon modèle. Et son numéro doit être passé en paramètre quand vous cliquez sur la cellule de la premiere vue.

Je ne comprends pas pourquoi vous avez un tableView dans la seconde view…

Comment passez vous à la seconde view ? Comment avez vous défini le segue (avec son ID SegueToInfos) pour aller à la seconde vue ?

La façon classique de le faire :

  • dans la 1ere class, définissez le segue pour aller à la seconde view

créez la fonction :

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

dans laquelle vous appellerez perform (segue …) créez la fonction prepare dans laquelle vous allez passer le paramètre à la seconde view:

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    }

Vous utilisez alors ce paramètre dans le seconde vue.

Pour être plus précis, il faut que vous montriez le code des 2 class.

Dans ma 1ère classe : MarqueTableViewControler  Je relis la première page a la deuxième avec ce code : 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {    
    if segue.identifier == "MarqueToModele" {      
         if let indexPath = tableView.indexPathForSelectedRow {        
               let destinationController = segue.destination as! ModeleViewController        
               destinationController.marque = Marques[indexPath.row]      
               }    
        }  
} 

Dans la fonction :  override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

Dans cette fonction je n'ai pas perform(segue...). Comment fonctionne t-il ? comment je peux le rajouter ? 

Ensuite dans la 2ème class : ModeleViewController  je relis la 2ème page à la 3ème et la 4ème avec ce code : 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {    
if segue.identifier == "MarqueLabelToMarqueInfo" {      
    let destinationController = segue.destination as! MarqueInfoViewController      
    destinationController.MarqueInfo = marque    
}    
if segue.identifier == "ModeleLabelToModeleInfo" {      
   let destinationController = segue.destination as! ModeleInfoViewController      
   destinationController.ModeleInfo = marque    
     }  
} 

Vous avez besoin d'autre parti de mon code ? @Claude31

Comment faites vous la transition vers le 2e controller ? Où sont définis les segue ?

Pour mieux comprendre ce qui se passe, ajouter des log:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {    
    if segue.identifier == "MarqueToModele" {      
         if let indexPath = tableView.indexPathForSelectedRow {    
               print("index",  indexPath.row)   
               let destinationController = segue.destination as! ModeleViewController        
               destinationController.marque = Marques[indexPath.row]      
               }    
        }  
} 

Que sont les 3e et 4e VC ?

Attention aux segue.

Si il est défini depuis la cell vers la destination (et non pas depuis le VC lui même), didSelectRowAt est appelé après l'exécution du segue. Donc le prepare n'a sans doute pas les bonnes properties à passer.

Problème d'affichage d'un tableau dans une TableView
 
 
Q