[Résolu] Un panel au niveau de l'application: quel objet choisir?
Bonjour tout le monde,
"Tout est dans le titre", c'est bien comme ça qu'on dit?
Plus sérieusement, j'ai une application multi-documents. Je souhaite ouvrir, au niveau de l'application, un NSPanel qui donne des informations sur le document actif (à la manière des inspecteurs de Pages, Numbers ou Aperçu).
Pour l'instant, j'ai une fenêtre dans le nib "Main Menu". J'y ai également un cube "AppDelegate", je binde donc sur lui la fenêtre et les objets qu'elle renferme. Tout va très bien, alors pourquoi poser la question, me direz-vous?
J'ai lu ici, souvent, que passer par l'appDelegate était une solution un peu méprisée, ce qui me laisse penser qu'il doit y avoir une meilleure façon de faire, mais laquelle?
Par exemple, je suppose que structurellement il serait plus indiqué de choisir un NSWindowController, mais comment retrouver cet objet dans l'application?
Faire un nib séparé contenant la fenêtre? Cela me donnerait son contrôleur, mais au niveau des bindings je fais comment? Je dérive NSWindowController, genre BFInspectorController, je le farcis d'outlets et je binde sur le FileOwner du nib?
Une autre solution plus élégante?
D'avance merci.
Réponses
Si tu as le Hillegass regarde comment il fait son panneau de préférences. Grosso modo, comme c'est un objet accessible à tous dans l'application il ajoute une action et la relie au menu item Préférences.. de l'application. Son appDelegate a une propriété preferencesController. La première fois qu'il est appelé il est créé à partir de PreferencesController (:NSWindowController) puis gardé sous le coude tant que l'application est alive puisqu'on peut le demander à n'importe quel moment.
Quand aux propriétés, puisqu'elles sont les mêmes partout au niveau de l'application, elles sont simplement entrées dans le NSUserDefaultsController qui est l'endroit idéal pour les stocker car on a un SharedUserDefaultsController dans tous les .nib et qu'on peut facilement les appeler de n'importe où ailleurs.
Mouais... donc même Hillegass passe par le appDelegate. Il y met une référence sur le windowController, moi sur la window... donc je vais en rester à ma solution, finalement. J'avais un petit doute conceptuel.
Merci, en tout cas.
Pardon, j'avais pas bien lu, pour une fenêtre qui va s'actualiser en fonction du document en premier plan tu peux utiliser les bindings sur les propriétés du document de la fenêtre active grâce au chemin Application->MainWindow->Document. Si tu veux que ta fenêtre d'infos puisse devenir la mainWindow tu devras passer par [[NSDocumentController sharedDocumentController] currentDocument]. SO a un lien qui pose exactement ta question.
Apple parle des bindings aussi ici
Merci laudema, j'avais raté ce lien (pourtant j'en ai vu des dizaines).
J'ai déjà une appli embryonnaire qui fonctionne. J'ai mis un bout de temps parce que:
1. Ce sont des NSPersistantDocuments (Core Data)
2. Mon panel n'aimait pas du tout que le dernier document se referme.
Tu peux suivre mes pérégrinations ici : http://forum.cocoacafe.fr/topic/10913-résolu-une-fenêtre-style-inspecteur-avec-des-documents-core-data-comment-faire/
Plutôt que de binder le NSPanel sur le document, c'est le document qui transmet son contexte au panel. Celui-ci doit par contre se brancher sur un contexte vide quand le dernier document se referme.
Mais j'utilise appDelegate, et je voulais savoir s'il y avait quelque chose de plus fin que ce "cheval de labour".
Tu peux toujours inventer un objet qui sera lié au document actif, peut être même au sharedDocumentController, et fera ce que tu veux. appDelegate est une facilité pour tout ce qui est partagé dans l'application. A toi de voir !
Tu peux ajouter ton objet dans MainMenu.xib.
Je pensais plus un truc du genre : tu sous-classes une NSWindowController et tu ajoutes l'objet dans MainMenu.xib
J'y ai pensé aussi