Bug dans Interface Builder ? (awakeFromNib)

damdamdamdam Membre
03:56 modifié dans API AppKit #1
Bonjour tout le monde,

Je viens de passer deux heures sur un bug étrange dont je voudrais savoir l'origine.

J'ai un AppController et un SourceViewController (sousclassé de NSTreeController) les deux dans mon XIB. Le AppController a un IBOutlet vers SourceViewController. Le SourceViewController est le delegate d'un NSOutlineView. Toutes les connections dans Interface Builder sont correctes.

Je dois faire une initialisation de SourceViewController quand celui-ci est chargé. Vu que c'est un IBOutlet, je la fais dans la méthode -[AppController awakeFromNib]

Or le bug que j'avais était que lorsque que les méthodes du delegate était appellées, je ne retrouvais pas l'objet de mon XIB.
En debuggant, j'ai mis deux NSLogs : un dans -[AppController awakeFromNib], et un autre dans la methode -[SourceViewController awakeFromNib]
Mon bug en question est que les deux objets étaient différents (avec deux adresses mémoires différentes)

J'ai résolu mon bug en recréant la connexion dans IB entre le AppController et le SourceViewController. Et la, les deux adresses mémoire étaient identiques.

Est-ce que je suis tombé sur un bug d'interface builder ou est-ce que je suis passé à  coté d'un problème de débutant ? On dirait que Interface builder a serialisé un "vieux" objet associé à  mon NSOutlineView, mais que le XIB contenait aussi un SourceViewController lié à  mon AppController. C'est possible ?

Question subsidiaire : si j'ai bien compris, au lancement, lors de la déserialisation des objets dans le XIB, l'application n'appelle pas la méthode -init, mais -initWithCoder, qui dégèle l'objet stocké par IB. C'est bon ?

Merci d'avance.

Réponses

  • NoNo Membre
    03:56 modifié #2
    dans 1240325367:

    Question subsidiaire : si j'ai bien compris, au lancement, lors de la déserialisation des objets dans le XIB, l'application n'appelle pas la méthode -init, mais -initWithCoder, qui dégèle l'objet stocké par IB. C'est bon ?


    Oui c'est ça.
    Ensuite, lorsque tous les objets lus du nib/xib sont créés, puis les connexons (dont les IBOutlets) sont établies, chaque objet reçoit le message awakeFromNib.
  • NoNo Membre
    03:56 modifié #3
    Concernant les bugs, cela à  toujours été.
    C'est pourquoi, dès que quelque chose cloche, il ne faut pas hésiter à  utiliser l'utilitaire ibtool (anciennement nibtool) qui permet notamment de vérifier l'intégrité du xib/nib.
Connectez-vous ou Inscrivez-vous pour répondre.