Menu désactivé et nib distant...

VeillardVeillard Membre
23:42 modifié dans Xcode et Developer Tools #1
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 :
- (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

Réponses

  • mpergandmpergand Membre
    août 2004 modifié #2
    Ben oui normal, tu essayes d'appeler une méthode dans un NSDocument qui n'existe pas puisque la fenêtre de ce document n'est pas ouverte, ce que tu cherche à  faire, euh! on tourne en rond là Â  :D

    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.
  • VeillardVeillard Membre
    23:42 modifié #3
    Ah OK...

    Donc dans ce cas on n'utilise pas la chaine des fisrt responder, mais une action classique dans un contrôleur

    tu veux dire qu'il faudrait utiliser un NSDocumentController ?
  • mpergandmpergand Membre
    23:42 modifié #4
    Non, je parle d'une classe controler indépendante des NSDocument. Une classe application délégate est une bonne solution, ça te permet par ex de charger un fichier avec application:openFile, regarde les méthodes déléguées de NSApplication.

    Mais, perso.m est un NSDocument ? Tu cherches à  ouvrir un nouveau document ou  seulement une fenêtre.
  • VeillardVeillard Membre
    23:42 modifié #5
    "Perso.m" s'appelle en réalité "Materiel.m". Je cherche à  réaliser un inventaire du matériel de plongée avec la possibilité d'avoir 2 fenêtre identiques simultanément mais avec 2 contenus différents (comme pour les carnets).
    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.
  • mpergandmpergand Membre
    août 2004 modifié #6
    Ok, c'est plus clair  ;)

    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]
  • VeillardVeillard Membre
    23:42 modifié #7
    Merci beaucoup. J'ai de quoi travailler cette nuit  ;)
  • VeillardVeillard Membre
    23:42 modifié #8
    Ca y est, ça marche !  :) :) :)
    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+
  • mpergandmpergand Membre
    août 2004 modifié #9
    [additif]

    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)
  • VeillardVeillard Membre
    23:42 modifié #10
    Merci pour tes infos, j'y vois plus clair maintenant  ;)
Connectez-vous ou Inscrivez-vous pour répondre.