[NSBundle] Gestion du chargement des NIB

06:00 modifié dans API AppKit #1
Bonjour à  tous,

je me pose quelques questions sur le sujet du chargement des fichiers.nib
Dans un de mes projets, j'ai un bouton qui m'affiche une fenêtre lorsque je clique dessus (du grand classique  ;) ). Cette fenêtre étant  indépendante de la fenêtre où se trouve le bouton (comme pour une meilleure organisation), j'ai mis cette fenêtre et tout ce qui la concerne dans un fichier .nib séparé.

J'ai fait le choix de charger le .nib lors du click sur le bouton avec ce code:
<br />if ([NSBundle loadNibNamed:@&quot;nib2&quot;] == NO) {<br />&nbsp; // problème -&gt; arrêt<br />} else {<br />&nbsp; //chargement OK -&gt; affichage de la fenêtre <br />}<br />


Et certaines questions m'assaillent :
    Je pensais que la .nib n'était chargée seulement si elle n'était pas déjà  en mémoire (un peu comme une .dll pour ceux qui connaissent Win). Or, en pratique ce n'est pas le cas. Il y a-t-il un moyen de savoir sur une .nib est déjà  chargée ? car actuellement à  part faire une variable statique du genre:
<br />static BOOL _dejaCharge = NO;<br /><br />if (!_dejaCharge ) {<br />&nbsp; // chargement de la .nib<br /><br />&nbsp; _dejaCharge&nbsp; = YES;<br />}<br />

je ne vois pas trop comment faire. Et je trouve cela moyen car rien ne m'assure que le fichier .nib ne sera pas chargé tout de même plusieurs fois (tout simplement dans des instances de classe différentes)  ::)  A l'exception d''utiliser une variable globale mais mes principes sont contre ce genre de chose  :D


    Une autre question est: quand est-ce que le fichier .nib se décharge ? En fait, je voudrais savoir si il y a un moyen de décharger un fichier .nib ?

Réponses

  • ClicCoolClicCool Membre
    août 2004 modifié #2
    Bonjour deftones_chrix,

    Il est normal qu'un nib puisse être chargé autant de fois qu'on le lui demande.
    les MyDocument.nib par exemple sont chargés pour chaque document et les objets sont instanciés pour chaque document. Et c'est bien comme ça.

    Pour ton problème, pourquoi ne pas charger une fois pour toute la fenêtre que tu dois utiliser tout au long de ton appli dans la méthode délégate d'appli: applicationDidFinishLaunching ?
    Par la suite, tu récupère auprès de ton délégate le pointeur sur la fenêtre.
    Enfin, quand on clique sur ton bouton tu lui adresse un makeKeyAndOrderFront
    sans oublier de régler ta fenêtre avec - setReleasedWhenClosed:NO afin qu'elle se cache mais ne soit pas désallouer à  la fermeture.

    Cette stratégie a l'avantage d'économiser les accès disques et le temps du désarchivage pour une fenêtre qui semble ici pouvoir être appelée souvent :)
  • 06:00 modifié #3
    Yes! Merci pour l'idée  :D
  • ClicCoolClicCool Membre
    06:00 modifié #4
    Peux être peux tu utiliser la méthode de NSBundle: - (BOOL)isLoaded

    Pour ma part je n'ai jamais eu l'occasion d'en avoir l'utilité  ;)
  • mpergandmpergand Membre
    06:00 modifié #5
    Nib files

    Posté sur un autre forum:


    Bien sûr que l'on peut avoir plusieurs nibs. Dans une appli Document-based, on crée un nib par type de document, ainsi que pour le panneau des préférences.
    Comme tu as pu le constater, on ne peut pas avoir de liaison inter-nibs. Alors comment c'est-y qu'on fait ?
    En fait c'est au niveau du chargement des nibs que les choses se passent: par ex pour le panneau de prefs:

    Lorsque l'utilisateur clique sur le menu Préférences pour la 1ere fois, tu dois charger ce nib par:
    loadNibNamed (NSBundle en ObjC, NSApplication en Java). Le deuxieme paramètre owner est un objet (controler) que tu choisiras pour recevoir tous les outlets que tu auras définis dans IB pour le File'sOwner. Une fois le nib chargé, les outlets de ton objet owner seront initialisés, en particulier celui de la fenêtre de prefs. Si l'utilisateur clique une 2eme fois sur le menu Prefs, tu n'as pas à  charger le nib, puisque c'est déjà  fait, tu peux le savoir, par exemple, en testant si l'outlet de le fenêtre à  bien été initialisé, sinon s'il est NULL, c'est qu'il faut charger le nib.

    Maintenant tu peux communiquer tous les objets référencés dans ce nib aux autres parties de ton programme, si c'est nécessaire.


    Il y a-t-il un moyen de savoir sur une .nib est déjà  chargée ?

    Donc dans ton cas, tu vérifies si l'outlet de ta fenêtre à  été initialisé.
Connectez-vous ou Inscrivez-vous pour répondre.