[Résolu] Un panel au niveau de l'application: quel objet choisir?

berfisberfis Membre
mai 2013 modifié dans API AppKit #1

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.


  • berfisberfis Membre


    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



     


    In an NSDocument-based application, the detail array controller's contentArray binding is typically bound to the NSApplication instance using the mainWindow.windowController.document.<yourmastercontroller> key path, substituting the master array controller's key for the final key in the key path

     


  • berfisberfis Membre
    mai 2013 modifié #5

    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 !


  • colas_colas_ Membre

    Tu peux ajouter ton objet dans MainMenu.xib.


  • berfisberfis Membre


    Pour l'instant, j'ai une fenêtre dans le nib "Main Menu".



  • colas_colas_ Membre

    Je pensais plus un truc du genre : tu sous-classes une NSWindowController et tu ajoutes l'objet dans MainMenu.xib




  • Je dérive NSWindowController, genre BFInspectorController, je le farcis d'outlets et je binde sur le FileOwner du nib?




    J'y ai pensé aussi  ;)

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