NSViewController [Résolu]
BertrandMartin
Membre
J'ai commencé à plancher le sujet des NSViewController pour refaire mon programme Electro Suite. J'envisage en effet de faire comme pour les Préférences Systèmes d' OS X, avec une fenêtre principale, affichant une box contenant, au lancement, tous les boutons des divers modules de calcul. En plus, un bouton hors de la box (peut être alors dans une barre d'outils) permettant à tout moment de revenir à cet écran. Puis chaque bouton affichera dans le cadre le module de calcul sélectionné.
J'ai trouvé un exemple qui propose de créer dans le fichier NIB principal des objets NSViewController pour chaque vue (au niveau d'Interface Builder), de fixer leur fichier NIB dans l'inspecteur des propriétés, fichiers constitués d'une vue contenant tous les éléments de contrôle. Chaque objet NSViewController aura une Outlet dans AppDelegate.h Puis, dans le code, pour afficher une vue on fait
avec testView1Controller désigant l'outlet créé pour l'objet NSViewController de la vue considérée et box pour l'outlet de la NSBox.
Alors, je retranscris tel que je l'ai compris. Est-ce que cette façon de faire est correcte ?
Ensuite, si cette solution marche, elle serait assez lourde dans mon cas car il me faudrait alors une instance par outil plus une, pour le panneaux de boutons d'acceuil. De plus, au démarrage, une instance de chaque panneau serait créé, même pour ceux ne servant pas dans la session.
Serait-il alors possible de créer l'instance par code en faisant
J'ai trouvé un exemple qui propose de créer dans le fichier NIB principal des objets NSViewController pour chaque vue (au niveau d'Interface Builder), de fixer leur fichier NIB dans l'inspecteur des propriétés, fichiers constitués d'une vue contenant tous les éléments de contrôle. Chaque objet NSViewController aura une Outlet dans AppDelegate.h Puis, dans le code, pour afficher une vue on fait
<br />
- (IBAction)switchView1:(id)sender<br />
{<br />
NSView *view = [testView1Controller view];<br />
<br />
[box setContentView:view];<br />
}<br />
avec testView1Controller désigant l'outlet créé pour l'objet NSViewController de la vue considérée et box pour l'outlet de la NSBox.
Alors, je retranscris tel que je l'ai compris. Est-ce que cette façon de faire est correcte ?
Ensuite, si cette solution marche, elle serait assez lourde dans mon cas car il me faudrait alors une instance par outil plus une, pour le panneaux de boutons d'acceuil. De plus, au démarrage, une instance de chaque panneau serait créé, même pour ceux ne servant pas dans la session.
Serait-il alors possible de créer l'instance par code en faisant
<br />
- (IBAction)switchView1:(id)sender<br />
{<br />
<br />
ViewController1 *testView1Controller=[[NSController view alloc]initWithNibName @"testView1"] //ViewController étant une classe héritée de NSViewController contenant le code de la vue, avec ses contrôles et tout<br />
NSView *view = [testView1Controller view];<br />
<br />
[box setContentView:view];<br />
}<br />
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Non, pas une outlet. Une outlet est un pointeur vers un objet du nib.
Un simple pointeur de NSViewController suffit.
ça devrait fonctionner, mais utiliser une NSBox n'est pas forcément nécessaire. Tu peux ajouter la vue gérée par le ViewController à n'importe quelle vue en utilisant -[NSView addSubview:].
Au contraire, ce n'est pas lourd. Certes, tu vas devoir créer une classe et un xib pour chaque panneau, mais tout ce qui concerne un panneau sera isolé dans une seule classe. Cette ségrégation va simplifier l'architecture de ton appli.
En fait, ton cas est même plus simple qu'habituellement, puisque tu n'as pas de valeurs à passer d'un view controller à un autre.
Non, ce n'est pas nécessaire. Seul le panneau actuellement affiché a besoin d'être présent en mémoire.
ça donnerait quelque chose comme ça:
Existe-t-il une méthode équivalente à windowDidLoad que je pourrai surcharger ?
(Oui, c'est un peu introuvable dans la doc).