InitWithCoder: non appelé au désarchivage d'un XIB

FloFlo Membre
04:05 modifié dans API AppKit #1
J'ai deux objets instanciés dans un XIB appartenant à  deux classes qui implémentent initWithCoder:.

Cependant cette dernière méthode n'est jamais appelée  :(
J'ai essayé de rajouter <NSCoding> pour chacune des classes, d'écrire les méthodes associées dans les .h ou encore d'implémenter également la méthode encodeWithCoder; mais rien n'y fait.

En plaçant un breakpoint dans les deux méthode initWithCoder: et en mode débug, ces derniers ne sont jamais atteints. (Et je me suis pas fait avoir par "Load symbols lazily"  ;))

J'ai fait un "clean all target", j'ai re-synchronisé IB et XCode, toujours rien...

Help !  :-\\

Réponses

  • AliGatorAliGator Membre, Modérateur
    04:05 modifié #2
    Bizarre... Attention il faut que tes méthodes aient exactement le bon nom, n'aurais-tu pas fait une faute de frappe par exemple en tapant [tt]-(void)initWithCoder:(NSCoder*)decoder[/tt] ?
    Les as-tu bien mises dans la bonne classe ? (Il m'arrive quand je fais parfois du refactoring par exemple de renommer mes fichiers mais d'oublier de renommer le nom de mes classes, ou de les changer dans IB, etc)...?
  • NoNo Membre
    avril 2009 modifié #3
    La règle de désarchivage des objets d'un xib/nib est assez complexe.

    En gros, il y a 3 types d'objets qu'IB reconnait :
    - ces propes objets (ceux qu'il fournit via ses palettes),
    - les custom views,
    - et le reste.

    Chaque objet a sa propre méthode d'initialisation :
    - les objets de IB : initWithCoder:
    - les custom views : initWithFrame:
    - le reste : init.

    Comme rien n'est dit à  propos de ces "deux objets instanciés dans un XIB", je te recommande de faire le test avec les 3 méthodes ci-dessus.

    Par exemple, tous mes objets de type contrôleur (qui ne sont que des sous-classes à  NSObject) reçoivent un init lors de leur instanciation via le nib.

    Tout est bien expliqué dans la doc Apple (point n°2 du paragraphe The Object Loading Process).
    Donc un petit coup d'oeil et tu seras fixé.

    Mais le plus sûr reste d'utiliser awakeFromNib qui est appelé quelques soit le type d'objet stocké dans le nib.
  • FloFlo Membre
    04:05 modifié #4
    Autant pour moi, j'avais lu que les objets crées dans un .nib ou un .xib étaient instanciés à  l'aide de la méthode initWithCoder:.

    Je ne savais pas qu'il y avait une distinction suivant le type de l'objet, mea culpa... En tous cas merci pour la rapidité et l'efficacité de votre aide à  tous les deux ! 
Connectez-vous ou Inscrivez-vous pour répondre.