Gestion du menu avec une application NSDocument based
olof
Membre
'jour !
J'ai une application NSDocument based. J'ai ajouté un item de menu dans le menu fichier pour faire des exports. Ca marche bien, sauf que cet item n'est jamais grisé. Il est accessible même quand aucun document n'est ouvert.
Y'a-t-il un moyen de gérer ça automatiquement ???
Merci
J'ai une application NSDocument based. J'ai ajouté un item de menu dans le menu fichier pour faire des exports. Ca marche bien, sauf que cet item n'est jamais grisé. Il est accessible même quand aucun document n'est ouvert.
Y'a-t-il un moyen de gérer ça automatiquement ???
Merci
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Il faut mettre cette action dans une classe qui est chargé en même temps que ton document. Et qui n'est plus chargé quand aucun document n'est chargé.
edit: j'ai oublié de dit qui fallait rajouter l'action dans l'object FirstResponder.
Nota : j'avais aussi essayé avec - (BOOL)validateMenuItem:(id <NSMenuItem>)menuItem mais sa me prenait la tête.
[tt]- (BOOL)validateMenuItem:(id <NSMenuItem>)menuItem[/tt]
Maintenant la question est de savoir où. La doc précise que cette méthode est appelée successivement sur une série d'objets:
Donc si ton document est le délégué de la fenêtre active, tu y implémentes la méthodes et tu renvoies YES. Puis tu implémentes cette méthode dans le délégué de l'application et tu renvoies NO. Pour identifier l'item, le plus prudent est de le faire sur base sur tag ou de l'action:
[tt]- (BOOL)validateMenuItem:(id <NSMenuItem>)menuItem {
if ([menuItem action] == @selector(exports) return NO;
return YES;
}[/tt]
Sans me soucier de l'état (grisé ou non) de cet item de menu, j'avais instancié ma classe qui sous-classe NSDocumentController dans le NIB MainMenu. Dans cette classe, j'avais ajouté la méthode -(IBAction)export:(id)sender et cette méthode faisait :
la méthode exportXML se trouvant dans ma classe qui sous-classe NSDocument.
Est-ce juste ???
Grâce à ça, quand je n'ai pas de document ouvert, l'item du menu est grisé.
Je continue, j'ajoute ça à ma classe qui sous-classe NSDocument :
Comme ça ne fonctionn pas, j'ai ajouté le log suivant avant le if, dans le code ci-dessus :
Et quand j'ai un document ouvert et que "j'ouvre" le menu Fichier, j'ai les infos suivantes dans le log :
Rien qui concerne mon menu Exporter. Faut-il faire quelque chose de spécial sur mon item de menu ???
[tt]
  [monMenu update];[/tt]
aux endroits appropriés (lors de l'ouverture d'un document et lors de la fermeture du dernier document) pour raffraichir ton menu.
Merci pour votre aide !!!
Et comment fait-on dans une application document-based pour ajouter des menuitems dans un sous-menu dynamiquement. Et pour modifier les titres de menuitems?
On utilise les méthodes dédiées de NSMenu :
Par exemple :
Setting up Menu Commands
– insertItem:atIndex:
– insertItemWithTitle:action:keyEquivalent:atIndex:
– addItem:
– addItemWithTitle:action:keyEquivalent:
– removeItem:
– removeItemAtIndex:
– itemChanged:
C'est juste que dans une document-based application, pas vraiment moyen de faire des liens entre le nib du document et le nib du mainmenu...
D'où l'utilité d'utiliser validateMenuItem: en lieu et place de setEnabled:
Enfin, j'ai trouvé ce matin une combine...
Dans le awakeFromNib: du document, on récupère les adresses des nsmenuitems que l'on veut utiliser directement. drawerMenu et voicesMenu sont des NSMenuItem* objets de ma classe dérivée de NSDocument :
Après, on peut s'amuser à faire des setTitle: et autres joyeusetés
Ce qui me semble bizarre dans ta question c'est l'attribution des rôles. Pour moi ce n'est pas vraiment à une instance de NSDocument de changer l'interface, mais cela incombe à un contrôleur général de l'application.
Donc ton code fonctionne, mais je préférerais pour ma part que la gestion des menus reste l'attribution d'un super-controller de l'application (via [NSApp delegate] par exemple)