Menu désactivé et nib distant...
Veillard
Membre
Bonjour,
J'ai une appli "Document based" contenant 3 nibs différents : MainMenu.nib, MyDocument.nib et Perso.nib.
J'ai cherché à ouvrir une fenêtre située dans un nib distant (Perso) à partir du menu. Pour cela, j'ai créé une action (openMyWindow:) dans le "1st Responder" du "MainMenu.nib" de manière à pouvoir ouvrir cette fenêtre via la chaà®ne des "1st Responder". Après avoir implémenté dans "Perso.m" ceci :
mon item de menu reste toujours en grisé
Ce qui est bizarre c'est que ça fonctionne bien quand l'implémentation se trouve dans le "MyDocument.nib" :-\
Comment peut-on résoudre ce problème ?
Merci à tous
J'ai une appli "Document based" contenant 3 nibs différents : MainMenu.nib, MyDocument.nib et Perso.nib.
J'ai cherché à ouvrir une fenêtre située dans un nib distant (Perso) à partir du menu. Pour cela, j'ai créé une action (openMyWindow:) dans le "1st Responder" du "MainMenu.nib" de manière à pouvoir ouvrir cette fenêtre via la chaà®ne des "1st Responder". Après avoir implémenté dans "Perso.m" ceci :
- (IBAction)openMyWindow:(id)sender
mon item de menu reste toujours en grisé
Ce qui est bizarre c'est que ça fonctionne bien quand l'implémentation se trouve dans le "MyDocument.nib" :-\
Comment peut-on résoudre ce problème ?
Merci à tous
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Ce principe du first responder fonctionne bien pour la sauvegarde d'un document, car c'est la méthode correspondant au document au premier plan qui sera appelée, mais pour l'ouverture ça peut pas marcher ! Donc dans ce cas on n'utilise pas la chaine des fisrt responder, mais une action classique dans un contrôleur. En fait ça pourrait marcher si tu implémentais cette méthode dans une classe application delegate, cette classe étant la dernière recherchée dans la chaine ( voir la doc sur "About the responder chain" )
Pour les menus grisés, je pense qu'il faut que tu ajoutes validateMenuItem dans la classe correspondante.
tu veux dire qu'il faudrait utiliser un NSDocumentController ?
Mais, perso.m est un NSDocument ? Tu cherches à ouvrir un nouveau document ou seulement une fenêtre.
J'avais utilisé la méthode des 1st Responder qui fonctionne à moitié. Quand j'ouvre le fichier contenant le matériel, la fenêtre apparaà®t automatiquement et en plus, le menu est activé, mais quand je ferme la fenêtre, le menu est désactivé...
Je vais mettre la b11 en ligne avec des fichiers d'exemples.
Tu veux donc gérer deux types de document avec le menu new. Comme je te l'avais dit, cela se passe dans application delegate. Tu définis une méthode newDocumentMenuAction et dans le main nib pour les menus new tu désignes cette méthode comme target. Dans la méthode newDocumentMenuAction tu crées ton document avec openUntitledDocumentOfType de NSDocumentController.
Projet complet, en java bien sûr:
[Fichier joint supprimé par l'administrateur]
Merci beaucoup pour ton code, j'ai pu comparer avec Java Il ne me reste plus qu'à régler un problème de tabulation dans ma fenêtre de matériel.
A+
En fait, on peut utiliser aussi la chaine des responders, la classe application delegate étant en bout de chaine. Donc il suffit d'implémenter newDocument dans appDelegate et voila. Personnellement, pour ce cas, je trouve que l'utilisation des responders pas trop logique, puisque la création d'un nouveau document n'est pas conditionnée par un responder ( main window, key window ,etc), donc définir une action perso n'est pas si mal...
Dans mon exemple, j'ai utilisé une classe application delegate, mais ça pourrait être n'importe quelle autre classe controller global à l'application, cà d créée au démarrage de l'appli ( pas NSDocument ! ) puisque l'appel de la méthode newDocumentMenuAction ne dépend pas de la chaine des responders. Mais je trouve que c'est pas un mauvais choix, car newDocument trouve logiquement ça place avec les autres méthodes déléguées ( applicationOpenFile, etc)