Func prepare fonctionne pas

Bonjour à tous,
voila mon problème.

j’essais de créer une liste de contact.
j’ai une contactTableView qui affiche des données provenant de Realm, et quand je clic sur sur un contact, je veux ouvrir un viewController qui affiche les details.

pour se faire j’utilise la func prepare dans mon contactViewController de base.

c’est la que j’ai un problème.

Ce contactViewController contient:
class contactViewController; UIViewController, UITableViewDataSource.

mon problème c’est quand j’appel self.tableView.indexpath dans ma func prepare, j’ai une erreur “ambiguous reference”

si je remplace
class contactViewController; UIViewController, UITableViewDataSource.
par
class contactViewController; UITableViewController

j’ai plus mon erreur, mais ma liste de contact ne ne remplie pas

Salut Olivier,

A première vu tu as oublier d’ajouter le UitableviewDelegate et les fonction qui vont avec.

Salut Olivier,

Peux tu nous faire quelques copies d’ecran ou copier ton code pour voir ce qui se passe…

Mais si il est nil c’est que tu n’envoies pas d’objet dans prépare segue

Bonne soirée

Slt Samir,

merci pour la piste, je regarde ça ce soir

Bonjour Gregoire

voici mon code

import UIKit
import RealmSwift

class contactViewController: UIViewController, UITableViewDataSource {

let realm = try! Realm()
var items : Results<contact>?
var item : contact?



override func viewDidLoad() {
    super.viewDidLoad()
    self.items = realm.objects(contact.self)
    displayContactCount()

    
    // Do any additional setup after loading the view
}

@IBOutlet weak var Ui_messageContactCount: UILabel!


func displayContactCount() {
    Ui_messageContactCount.text = "vous avez \(self.items!.count) Contacts"
}




override func viewDidAppear(_ animated: Bool) {
    displayContactCount()
    
}

  func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return self.items!.count
}


 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
    let cell = tableView.dequeueReusableCell(withIdentifier: "contact_cell", for: indexPath)
    let item = items?.sorted(byKeyPath: "name", ascending: true)[indexPath.row]
    cell.textLabel?.text = item?.name
    return cell
    
}

 func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == UITableViewCellEditingStyle.delete{
        if let item = items?.sorted(byKeyPath: "name", ascending: true)[indexPath.row]{
            try!realm.write {
                realm.delete(item)
            }
            tableView.deleteRows(at: [indexPath], with: UITableViewRowAnimation.automatic)
            tableView.snapshotView(afterScreenUpdates: )
        }
    }
}


override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func prepare(for segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "showDetail" {
        if let cell = sender as? UITableViewCell {
            if let indexPath = self.tableView.indexPathForSelectedRow(){
               let selectedContact = items?.sorted(byKeyPath: "name", ascending: true)[indexPath.row]
              let contactViewController:contactViewController = segue.destination as! contactViewController
               contactViewController.item = selectedContact
            }
        }
    }

}
}

Il y a une chose que je ne comprends pas dans ton projet.
ContactViewController c’est le controleur de la liste ou du détail ?
Car j’ai l’impression que tu utilises le même contrôleur pour 2 écrans différents.
Il t’en faut un pour gérer la liste et un différent pour l’écran qui affichera les détails d’un contact.

Ensuite pour ton problème de self.tableView :

  • Seul UITableViewController possède une variable tableView pré-connectée c’est pour cette raison que ça compile quand tu met ContactViewController : UITableViewController
  • Si tu n’as rien à l’intérieur c’est peut être parceque ton Storyboard n’est pas prévu pour un UITableViewController mais pour un UIViewController avec une table à l’intérieur.
  • Si tu veux garder le UIViewController avec une table à l’intérieur, alors il te faut créer un outlet pour ta table que tu pourras utiliser dans ton prepare

j’ai bien un contrôleur pour la liste de contact, et un autre pour le détail du contact.

effectivement j’avais un UIViewcontroller.
j’ai recréer avec UITableViewController, et ca compile. impeccable merci.

maintenant la fonction prépare ne fonctionne pas.
lorsque j’ouvre le détail, rien ne s’affiche dans les UITextField :frowning:
je pense de je ne fais pas la bonne liaison a realm. je cherche… :wink:

impeccable ça fonctionne.

merci à tous

Du coup je ne comprends pas ceci. La destination devrait être ton contrôleur de détail et non le contrôleur de liste non ?

Effectivement la destination n’était pas la bonne.
Maintenant j ai ca:

let contactViewController:ficheContactViewController = segue.destination as! FicheContactViewController