Truc bizarre avec IB

chaps31chaps31 Membre
11:07 modifié dans API AppKit #1
J'instancie un NSObjet dans un nib puis fixe la classe à  une classe que j'ai créé, le but : faire exécuter un awakeFromNib, problème, la méthode awakeFromNib ne s'exécute pas... 2 questions :

- Peut-on au sein d'un même nib instancier plusieurs classes avec chacune un awakeFromNib, qui s'exécuteront tous ? J'avais 2 instances de classes dans mon nib, j'ai essayé de retirer la première ça ne change rien...

- Ma classe s'appelle "InterfacClient", et à  a grande surprise lorsque IB instancie ma classe il l'appelle "Interfac Client", avec un espace... bizarre non ? Cela explique-t'il l'awakeFromNib non exécuté ? A quoi cela est-il dû ?

Merci encore

Réponses

  • chaps31chaps31 Membre
    11:07 modifié #2
    Bigre...  B)   Mon MainMenu.nib n'a plus aucune classe instanciée, un file's owner sur NSApplication et l'awakeFromNib de ma première classe s'éxécute toujours mais pas celui de la 2eme... Bon faut que je potase sérieusement IB...


    PS : désolé de tant de question en ce moment mais rassurez-vous j'enregistre tout, comme il y a qques semaines de ça des infos sur les dictionary réutilisées aujourd'hui  ;)
  • AliGatorAliGator Membre, Modérateur
    11:07 modifié #3
    dans 1229619073:

    J'instancie un NSObjet dans un nib puis fixe la classe à  une classe que j'ai créé, le but : faire exécuter un awakeFromNib, problème, la méthode awakeFromNib ne s'exécute pas... 2 questions :

    - Peut-on au sein d'un même nib instancier plusieurs classes avec chacune un awakeFromNib, qui s'exécuteront tous ? J'avais 2 instances de classes dans mon nib, j'ai essayé de retirer la première ça ne change rien...
    J'ai jamais essayé mais à  priori aucun souci, tu peux mettre deux instances de la même classe dans un même NIB, il instanciera bien deux fois ta classe, en appelant le awakeFromNib de chaque instance.
    Le awakeFromNib est automatiquement appelé une fois que le NIB est chargé et que tous les objets du NIB ont été instancié et toutes les connexions (outlets) réalisées. Alors tous les objets de ton NIB sont tous prêts, et il appelle le awakeFromNib de chaque instance créée (je veux dire il appelle pas le awakeFromNib au fur et à  mesure qu'il crée les instances, au risque s'il faisait ça que le awakeFromNib d'un objet soit appelé et que dedans tu utilises une référence ou un outlet vers un autre objet de ton NIB qui lui ne serait pas encore prêt)

    dans 1229619073:
    - Ma classe s'appelle "InterfacClient", et à  a grande surprise lorsque IB instancie ma classe il l'appelle "Interfac Client", avec un espace... bizarre non ? Cela explique-t'il l'awakeFromNib non exécuté ? A quoi cela est-il dû ?
    Non non pas bizarre du tout, IB essaye de donner automatiquement un nom (qui ne sert que pour l'affichage dans IB, on est bien d'accord, et n'ont aucune conséquence côté code) aux instances que tu places dans le NIB, en fonction du nom de la classe.
    Si tu places un objet de ta classe perso AppController, il va nommer le cube bleu ainsi instancié dans IB "App Controller". Si tu places un objet de la classe NSArrayController dans ton NIB, il va afficher "Array Controller" comme nom pour cette instance dans IB. Il ajoute tout seul des espaces avant les majuscules pour séparer les mots, etc.
    Mais rien ne t'empêche de modifier ces noms affichés (qui ne servent uniquement qu'à  te retrouver dans tous tes objets IB, et n'ont aucun lien avec le code hein) en double-cliquant sur ces noms et en les appelant "toto1", "toto2", etc par exemple ;)


    Pour ton pb de awakeFromNib pas appelé, vérifie la signature de ta méthode peut-être : [tt]-(void)awakeFromNib { ...ton code... }[/tt]
  • chaps31chaps31 Membre
    11:07 modifié #4
    Quel abruti je fais !!!!!  :o :o :)beta:

    Quand j'ai commencé mon projet je bouquinais le dernier livre trouvé sur Cocoa de Hillegass, je lisais un chapitre sur la localisation et j'ai créé 2 fichiers un French et un English dans mon MainNib, je ne suis pas allé plus loin et j'ai oublié par la suite ce test...

    Sauf que IB m'ouvre le nib English et le compilo le NIB french !!!! D'ailleurs au passage s'il faut refaire toutes les fenêtre pour chaque langue... je ne vois pas l'utilité je pensais que pour les différentes langues les fenêtres seraient les mêmes (hormis les textes), mais peu importe la localisation n'est pas du tout d'actualité.

    Merci encore et désolé pour cette bévue... Maintenant va quand même falloir que je me penche sur la localisation...

  • schlumschlum Membre
    11:07 modifié #5
    La localisation se fait à  la fin quand on n'a plus à  modifier l'interface !

    PS : ce n'est en aucun cas le compilateur qui va charger le .nib ; c'est un chargement dynamique !
  • chaps31chaps31 Membre
    11:07 modifié #6
    Je prend note et donc repousse la localisation, merci.

    Erreur du matin :
    <br />NSWindow does not support utility styleMask 0x10
    


    Quelqu'un a un traducteur ? Ca ne gêne en rien l'exécution de mon code, mais mon mac et moi on ne parle plus la même langue...  :P
  • chaps31chaps31 Membre
    décembre 2008 modifié #7
    J'ai trouvé ça sur le net :

    0x0F is 0000 1111 in binary, Ox10 is 0001 0000 in binary, so the IB windows that come with a style mask of 0x0F don't have 0x10 set. 0x10 is 'NSUtilityWindowMask' from NSPanel.h. If you make your window into a panel in IB by changing the custom class to 'NSPanel' you'll be able to uncheck the 'utility mask' option in the attributes inspector. IB 3.0 clears this bit for you when you downgrade a NSPanel to an NSWindow. Did you create this nib with IB 2.x initially and then downgrade an NSWindow to an NSPanel?


    Mais cela n'est pas très clair car je n'ai pas de "utility mask" dans l'onglet attributes de l'inspecteur... Je cherche

    Edit : Le moteur de recherche du forum n'a rien donné mais lorsque j'ai googlé mon erreur j'ai un lien vers une discussion sur objective-cocoa datant de 2006. Bon pas de solution dans ce post... Mais google plus efficace que le moteur de recherche interne au forum ?  :P
  • CéroceCéroce Membre, Modérateur
    11:07 modifié #8
    Pourtant c'est relativement clair: l'attribut "Utility" est certainement coché sous IB.
    Or les NSWindow ne peuvent pas avoir cet attribut. Les NSPanel, si.

    T'as dû créer un NSPanel à  la place d'une NSWindow quelque part.
  • chaps31chaps31 Membre
    11:07 modifié #9
    Ben non... Les 2 fenêtres de mon NIB sont bien des NSWindow...
  • schlumschlum Membre
    11:07 modifié #10
    Peut-être que tu avais un NSPanel que tu as transformé en NSWindow non ?
    Et le NSPanel avait l'attribut "Utility" coché...
  • chaps31chaps31 Membre
    11:07 modifié #11
    Tout à  fait possible mais étrange qu'il continue à  m'envoyer ce message alors que la fenêtre est déclarée NSWindows dans l'inspecteur...
Connectez-vous ou Inscrivez-vous pour répondre.