Connexion d'un menu item à  travers deux nib

shebsheb Membre
08:17 modifié dans API AppKit #1
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 :)

Réponses

  • Philippe49Philippe49 Membre
    08:17 modifié #2
    dans 1218052036:

    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

    La configuration classique

    dans 1218052036:

    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,

    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];
    }

  • Philippe49Philippe49 Membre
    08:17 modifié #3
    = chapitre 12 de "Cocoa Programming for Mac OS X" , 3rd edition
  • Philippe49Philippe49 Membre
    08:17 modifié #4
    dans 1218052036:

    puis j'ai essayé de jouer avec le first responder mais sans succès.

    Cela marcherait aussi, en faisant de AppController le delegate de NSApp, mais je préfère la première solution.
  • shebsheb Membre
    08:17 modifié #5
    Merci pour la réponse. Juste avant que tu ne répondes j'ai réussi a faire ça :

    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.
  • Philippe49Philippe49 Membre
    août 2008 modifié #6
    Cela marche peut-être, mais ce n'est pas très académique.
    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
  • GercofisGercofis Membre
    08:17 modifié #7
    Ici ça ne marche pas :
    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
  • Philippe49Philippe49 Membre
    janvier 2009 modifié #8
    dans 1230533639:

    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.

  • Philippe49Philippe49 Membre
    08:17 modifié #9
    dans 1230533639:


    if(preferenceController) {
    preferenceController = [[PreferenceController alloc ] init ];
    }

    sans commentaire ...  >:D  :o   :brule: ::)
  • GercofisGercofis Membre
    décembre 2008 modifié #10
    Le pire c'est que j'y ai pensé, mais pas au bon moment...
    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:-

     

Connectez-vous ou Inscrivez-vous pour répondre.