Contrôle de menus

mimivdcmimivdc Membre
23:35 modifié dans API AppKit #1
Bonjour et excellente année 2005 à  tous,

Je viens de faire mes permières armes sur Cocoa avec la gestion d'une fenêtre via un NSWindowController et d'une tableView, le résultat est plutôt bon !

En revanche, j'ai un gros problème. Mon logiciel de comptabilité gère beaucoup de menus dont l'utilisation est dépendante des actions de l'utilisateur et notamment dans des fenêtres, il m'est donc impossible de faire des connexions directes depuis Interface Builder puisque mes menus et mes fenêtres sont dans des fichiers différents. J'ai cherché l'équivalent d'un NSWindowController pour les menus, mais je n'ai rien trouvé. Alors j'ai essayé d'utiliser l'ApplicationController, un contrôleur de mon cru et un NSObjectController. Dans chaque cas (1 seul menu pour l'instant, mais j'aurais à  les contrôler tous), j'ai déclaré le menu item de mon menu (NSMenuItem) ou mon titre de menu (NSMenu) en tant qu'IBOutlet et créé une fonction qui retournait sa valeur : -(NSMenu*)societeMenu return societeMenu. Dans tous les cas j'ai le même problème. Lorsque je n'alloue pas d'instance depuis l'appelant (dans mon cas un NSObject ou un NSDocument qui gère mes données) sur mon contrôleur, il me dit que ma méthode n'est pas reconnue, et lorsque j'en alloue une il me renvoit systématiquement nil (ce que je comprend puisque j'imagine, le contrôleur est déjà  instancié au lancement de l'application). J'ai essayé de récupérer sous forme de variable globale mon contrôleur à  partir de la méthode applicationDidFinishLaunching de mon ApplicationController, en vain.

Si quelqu'un pourrait m'aider, ce serait super. Idéalement, un mini projet (je travaille sur MacOS X 10.3.7) serait l'idéal, d'autant que je pense que cela peut servir à  d'autres. Je n'ai rien trouvé dans Objective Cocoa ou dans les examples Apple quelque chose qui réponde à  mon problème, à  part de créer tous les menus moi-même (ce qui serait très long et dommage sachant que je n'utilise pour leur création qu'une interface parfaitement standard).

Merci d'avance.

Michel.

Réponses

  • Eddy58Eddy58 Membre
    janvier 2005 modifié #2
    Une solution est de créer tout tes menus dans IB, en créant autant d'instances nécessaires, ensuite selon le cas tu changes ton menu avec l'instance voulue. Ou alors il faut mettre en place des menus contextuels dans tes fenêtres. :)
  • mimivdcmimivdc Membre
    23:35 modifié #3
    Merci beaucoup Eddy,

    Après des recherches dans une nouvelle direction, j'ai pû trouver la solution : j'utilise [NSApp mainMenu] pour récupérer le menu item depuis ma barre de menu et submenu pour récupérer le menu lui-même. Je me suis créé une petite classe qui permet d'activer ou de désactiver une option de menu ou un menu complet. Voici le détail pour ceux que cela intéresse (le code est un peu concentré).

    **************************************************************
    #import "menus.h"

    @implementation menus

    // Retourne un menu de la barre depuis son n° (utilisation interne)
    -(NSMenuItem*)GetMItemFromBar:(int)item
    {
    return [[[NSApp mainMenu] itemAtIndex:item] self];
    }

    // Active / désactive un menu
    -(void)SetEnabledMenu:(int)menu set:(BOOL)active
    {
    [[self GetMItemFromBar:menu] setEnabled:active];
    }

    // Active / Désactive une option de menu
    -(void)SetEnabledItem:(int)menu anItem:(int)item set:(BOOL)active
    {
    [[[[self GetMItemFromBar:menu] submenu] itemAtIndex:item] setEnabled:active];
    }

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