Connexion d'un menu item à travers deux nib
sheb
Membre
Bonjour a tous,
J'ai actuellement deux nib dans mon application : MainMenu et Preferences
MainMenu contient la fenêtre principale, le menu ainsi qu'un objet AppController derivant de NSObject
Preferences contient un fenêtre et son controller dérivant de NSWindowController
Je cherche à connecter un NSMenuItem de MainMenu pour afficher la fenetre contenu dans le nib Preferences. J'ai essayé divers moyen (connecter l'item à AppController puis charger le nib Preferences, puis lancer le message correspondant au controller, puis j'ai essayé de jouer avec le first responder mais sans succès).
Ma question est la suivante, quelle est la méthode standard et la plus propre de faire cela en cocoa ?
Merci d'avance
J'ai actuellement deux nib dans mon application : MainMenu et Preferences
MainMenu contient la fenêtre principale, le menu ainsi qu'un objet AppController derivant de NSObject
Preferences contient un fenêtre et son controller dérivant de NSWindowController
Je cherche à connecter un NSMenuItem de MainMenu pour afficher la fenetre contenu dans le nib Preferences. J'ai essayé divers moyen (connecter l'item à AppController puis charger le nib Preferences, puis lancer le message correspondant au controller, puis j'ai essayé de jouer avec le first responder mais sans succès).
Ma question est la suivante, quelle est la méthode standard et la plus propre de faire cela en cocoa ?
Merci d'avance
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
La configuration classique
Ben oui, c'est la méthode classique
Dans l'interface de AppController :
PreferenceController *preferenceController;
....
Dans l'implémentation :
- (IBAction)showPreferencePanel:(id)sender
{
// Is preferenceController nil?
if (!preferenceController) {
preferenceController = [[PreferenceController alloc] init];
}
NSLog(@Showing %@", preferenceController);
[preferenceController showWindow:self];
}
Cela marcherait aussi, en faisant de AppController le delegate de NSApp, mais je préfère la première solution.
Dans Preference.nib => attribution du File's Owner à AppController puis connexion d'un outlet entre le File's Owner et PreferenceController.
Ensuite dans le code de AppController :
IBOutlet PreferenceController *preferenceController;
- (IBAction)showPreferencePanel:(id)sender
{
[NSBundle loadNibNamed:@Preferences owner:self];
[preferenceController showWindow:self];
}
Le bouquin "Cocoa Programming for Mac OS X" , 3rd édition, je le recevra normalement vendredi, ça devrait être un soulagement car c'est pas évident de comprendre tous les mécanismes des fichiers nib.
Voilà la solution préconisée :
• La classe PreferencesController hérite de NSWindowController
• Dans Preferences.nib, le File's Owner est de la classe PreferenceController.
• La méthode init de la classe PreferencesController :
   @implementation PreferenceController
   - (id)init
   {
if (![super initWithWindowNibName:@Preferences])
return nil;
return self;
   }
   - (void)windowDidLoad
   {
NSLog(@nib file loaded);
   }
• L'outlet window de PreferenceController = File's owner est connecté au panel de ce nib
• Dans AppController, la déclaration est simplement
  @class PreferencesController
   @interface AppController : NSObject {
     PreferencesController * prefController;
     ....
   }
   -(IBAction) showPreferencesPanel:(id) sender;
     // code dans un post ci-dessus
• L'item Preferences connecté à cette méthode de AppController
Ainsi, les deux nib sont totalement étrangers l'un à l'autre
http://gercofis.free.fr/Cocoa/RaiseManMarchePas.zip
Ici ça marche :
http://gercofis.free.fr/Cocoa/RaiseManQuiMarche.zip
Pour vérifier il suffit de demander les préférences le même exemple que le post précédent.
Pendant qu'on est dans cette question pourquoi faire un 2ème NIB
Un principe d'économie. Il est rare pour un utilisateur de changer les préférences, donc inutile d'alourdir le fonctionnement courant du programme par le chargement inutile d'un nib.
C'est une recommandation d'Apple de charger les ressources au fil des besoins.
De plus, découper l'interface graphique en plusieurs nibs permet plus de clarté dans la conception du programme.
if(preferenceController) {
preferenceController = [[PreferenceController alloc ] init ];
}
sans commentaire ... >:D :brule: ::)
Comme quoi un oe“il différent...
J'ajoute qu'une écriture de code comme tu présentes eu beaucoup mieux pisté le blème;
donc éviter cette formule:
if(preferenceController) preferenceController = [[PreferenceController alloc ] init ];
et préférer celle-ci:
if(preferenceController) {
preferenceController = [[PreferenceController alloc ] init ];
}
avec le pointeur de débugage ça se serait vu de suite..
:crackboom:-