Changer une vue perso

UniXUniX Membre
12:48 modifié dans API AppKit #1
Salut.

J'ai une vue perso placée dans une fenêtre d'un nib. Dans ce même nib, j'ai défini 2 autres vues qui apparaissent dans la fenêtre ou l'on voit le file's owner et le first responder.

vues_perso.png

Comment faire pour que ma vue perso soit vueAfficheurs ou vueEchelle selon le cas ?
En fait, je voudrais faire l'équivalent de setContentView: pour NSWindow, mais appliqué à  une vue, pas à  une fenêtre entière.

Merci.

Réponses

  • CéroceCéroce Membre, Modérateur
    12:48 modifié #2
    On utilise d'habitude une NSTabView (en masquant ses onglet), et on change l'onglet en fonction de la vue à  afficher.

    Si j'ai bien compris ta question...
  • UniXUniX Membre
    12:48 modifié #3
    Oui, j'ai effectivement utilisé cette technique, mais j'ai des problèmes de rafraichissement (voir post http://www.objective-cocoa.org/forum/index.php?topic=1418.0). Je voudrais donc essayer une autre technique que la NSTabView .....
  • Eddy58Eddy58 Membre
    12:48 modifié #4
    Tu as la technique de l'OffScreen panel. :)
    - Tu glisses un NSPanel dans la fenêtre de tes instances.
    - Dans ce panel tu mets deux NSBox, de mêmes tailles, pour chacune de tes vues, vueAfficheurs et vueEchelle, que tu transfères dans ces NSBox.
    - Dans ta fenêtre où tu permutes les vues tu mets une NSBox vide pour ta vue perso de même taille que celles ci-dessus. A noter que toutes les NSBox sont bien sur sans titres et sans contours.
    - Tu définis les outlets de ton contrôleur vers l'offscreen panel, les 3 NSBox et ton contrôle pour la permutation, par exemple un bouton popup.
    - Dans l'interfaçage du controleur tu définis les outlets :
    [tt]
    IBOutlet NSPanel *offScreenViewsPanel; // OffScreen Panel
    IBOutlet NSView *vueAfficheurs;           
    IBOutlet NSView *vueEchelle;
    IBOutlet NSBox *vuePerso;
    IBOutlet NSPopUpButton *choixViewPopUp;
    [/tt]
    - Dans l'implémentation, tu mets le code suivant :
    [tt]
    // Lors de l'initialisation on retient les vues de l'offscreen panel avant de le releaser lui et ses vues.
    -(void)awakeFromNib
    {
        [vueAfficheurs retain];
        [vueAfficheurs removeFromSuperview];
        [vueEchelle retain];
        [vueEchelle removeFromSuperview];
        [offScreenViewsPanel release];
        offScreenViewsPanel=nil;
        [vuePerso setContentView:vueAfficheurs]; // Vue par défaut
    }

    // On permute la vue selon le choix
    -(IBAction)choixTabView:(id)sender
    {
        if ([[choixViewPopUp selectedItem] tag]==0)
        {
            [vuePerso setContentView:vueAfficheurs];
            return;
        }
        if ([[choixViewPopUp selectedItem] tag]==1)
        {
            [vuePerso setContentView:vueEchelle];
        }
    }

    -(void)dealloc
    {
         [vueAfficheurs release];
         [vueEchelle release];
         [super dealloc];
    }
    [/tt]
  • 12:48 modifié #5
    Quelle complication Eddy ;)

    On peut relier un outlet directement à  une NSView dans la fenetre montrée par UniX, quel intéret de passer par un panel? En plus, ne passant pas par un panel, tu n'est pas obligé de t'occuper de la gestion de la mémoire.
  • Eddy58Eddy58 Membre
    12:48 modifié #6
    C'est bizarre, mais je m'attendais à  celle là . :P
    C'est simplement pour une meilleure lisibilité dans IB. C'est vrai que pour 2 ou 3 views, ça n'embarrasse pas trop l'écran et la fenêtre d'instances dans IB, mais quand tu as par exemple 6 ou 7 views bien chargées en contrôles, ça devient vite le bazard dans IB, d'où l'intérêt de regrouper les views dans un panel pour soulager la fenêtre d'instances et l'écran de fenêtres multiples. Perso je trouve que c'est une bonne habitude même si ça demande un peu de code supplémentaire. :)
  • UniXUniX Membre
    12:48 modifié #7
    Bon en fait j'ai tenté un truc, qui consiste à  afficher mes vues vueAfficheurs et vueEchelle en subView de ma vue perso.

    Lorsque je veux en afficher une, je supprime toutes les subViews de ma vue perso et je rajoute la bonne des 2.

    Malheureusement, j'ai toujours ce satané problème de rafraichissement (enfin, j'imagine que c'est un problème de rafraichissement ...)  >:( >:( >:(

    Il faut que je réfléchisse à  autre chose ....
Connectez-vous ou Inscrivez-vous pour répondre.