TableViewController segue

Bonjour,
je voudrais ouvrir une fenêtre de paramètrage depuis un TableViewController.
Je gère au départ à partir d'une fonction "func prepare(for segue:" 2 buttonItem(s) pour la gestion de mes données.
Lorsque je rajoute un 3ème buttonItem avec une liaison vers un 3ème ViewController de paramètre, mon programme s'arrête et me renvoie vers ma fonction "prepare segue" avec le message "Could not cast value of type"
Merci d'avance pour votre aide
Jean-Luc

Réponses

  • LarmeLarme Membre
    15 janv. modifié #2

    Pourrais-tu donner le message complet de "Could not cast value of type"?
    Le message est assez explicite en soi, donc si tu ne le comprends pas, on va t'aider à le comprendre et ainsi si tu le retrouves, tu pourras le débugguer rapidement et sans attendre de l'aide externe.

    Tu pourrais aussi peut-être rajouter un bout de code pour montrer la différence entre quand ça marchait à 2 boutons et quand ça ne marche plus avec le troisième bouton (d'ailleurs seulement sur ce troisième bouton ?, ou depuis tous foirent ?)

  • jean-lucjean-luc Membre
    15 janv. modifié #3

    Les autres boutons fonctionnent correctement.

    Le message d'erreur complet :
    "Could not cast value of type 'UIViewController' (0x10dbbcca8) to 'ListeLivres.ViewController' (0x10aa07f28).
    2018-01-15 12:21:39.063241+0100 ListeLivres [1538:94967] Could not cast value of type 'UIViewController' (0x10dbbcca8) to 'ListeLivres.ViewController' (0x10aa07f28)."

    Et le bout de code de la fonction "prepare(for segue:" est :smile:

        let viewVC = segue.destination as! ViewController
    
        if segue.identifier == "ajouterLivre" {
            viewVC.isAchatEditing = false
            print("ajouter")
        }
    
        if segue.identifier == "voirDétails" {
            let indexPath = tableView.indexPathForSelectedRow
            let achatSelected = achats[(indexPath?.row)!] as NSDictionary
            viewVC.achat = achatSelected
            viewVC.isAchatEditing = true
            print("details")
        }"
    

    J'espère que cela suffit
    merci

  • LarmeLarme Membre

    Could not cast value of type 'UIViewController' (...) to 'ListeLivres.ViewController' (...)

    Explications:
    Quelque part tu as un objet de classe UIViewController et tu dis à ton code traites-le comme un objet de classe ListeLivres.ViewController (ie un ViewController).
    Elles sont je suppose assez proches : ViewController hérite de UIViewController, mais faire passer un UIViewController par sa classe fille, c'est plus compliqué, car sa classe fille implémente potentiellement pleins d'autres propriétés différentes (achats, isAchatEditing, etc.), d'autres méthodes, etc.

    En regardant donc ton code :
    let viewVC = segue.destination as! ViewController devrait être la ligne qui fait planter tout ça. Tu as grosso-modo écrit : « créées une variable local viewVC que tu récupères de segue.destination » pour la partie let viewVC = segue.destination. Pour le as! ViewController c'est plus : « écoute mon p'tit compileur je sais ce que je fais, je te dis que cet objet est de classe ViewController et si c'est pas le cas t'es pas content et tu crasheras ».

    Voici grosso-modo l'explication.

    À partir de là, on en déduit dont que viewVC est un object de classe UIViewController et pas de classe ViewController.
    UIViewController étant la classe de base, j'en déduis que dans ton storyboard, tu n'as pas mis la classe à ton controller, tu l'as laissé par défaut UIViewController au lieu de ViewController.

    Allons plus loin sur ton code :
    Évite d'appeler tes classes juste ViewController, c'est confusant, essaye BookViewController, EditBookViewController, etc. Tes 3 UIViewController sont de la même classe ? Ils font pareil ? C'est étrange ça. Ils bouclent sur eux-même j'espère alors au niveau du Storyboard (or l'erreur me laisse penser que non).
    Évite NSDictionary en Swift 3+, préfères les Dictionary (Swift). En bref, évites tant que tu peux un truc qui commence par NS s'il existe son équivalent en Swift (NSDate, NSString, etc).

  • En tous cas, merci pour l'explication.
    Bon am.
    Jean-Luc

Connectez-vous ou Inscrivez-vous pour répondre.