Petits problèmes liés au multinib.

Nebuchad34Nebuchad34 Membre
août 2009 modifié dans Objective-C, Swift, C, C++ #1
Bonsoir,

Je travaille sur une document-based application. Accrochez vous, car c'est pas évident à  expliquer.

J'ai donc une classe MyDocument qui, comme c'est l'usage dans ces cas là , est une classe Model-Controller.

La fenêtre associée affiche une splitview présentant à  gauche une source list type iTunes et à  droite une NSView, appelons là  "DisplayedView". Celle-ci aura pour but d'afficher les vues en fonctions de ce sur quoi cliquera l'utilisateur dans la source list.
Jusque là  tout va bien.

Ma source liste étant une sous classe de NSOutlineView un peu particulière copiant le style iTunes (je l'ai téléchargé sur ce forum, je ne sais plus qui avait donné le lien), j'ai une classe "SourceListController" de type NSObject, qui se charge de lister les différentes sources à  l'awakeFromNib, et qui gère les changements de vues en fonction du choix de l'utilisateur.

Souhaitant abréger le temps de chargement de l'appli (car avant je chargeais tout dans le même nib et cela prenait une plombe au lancement), chaque vue est stockée dans son propre Nib avec son propre viewController. Les vues sont alors chargée dynamiquement au fil de l'exécution, et tout fonctionne assez bien.

Mon problème apparait au lancement de l'appli, lorsque je souhaites utiliser les données du modèle pour mettre à  jour la première vue qui se charge par défaut : ça marche une fois sur deux !

Pour que ce soit plus clair, voici la logique d'exécution :

>Lancement de l'application
>Création automatique d'une instance de MyDocument
>Chargement de MyDocument.xib
>MyDocument appelle "awakeFromNib" et donne des valeurs par défaut à  quelques propriétés du modèle.
>sourceListController  génère alors les différentes sources, sélectionne la première source, ce qui a pour conséquence de lancer un "initWithNibName..." sur mon premier viewController.
>Celui-ci charge sa vue, qui est alors affichée dans la DisplayedView de ma splitView par le sourceListController. Dans l'awakeFromNib du viewController, je fais la chose suivante :
MyDocument *document = [[NSDocumentController sharedDocumentController] currentDocument]; pour accéder à  mon modèle, et je met alors à  jours ma vue avec les données du modèle.

Et là , "des fois" ça ne marche pas...

Si quelqu'un me trouve une explication, je lui en serais très reconnaissant...
Je cherche depuis des heures et je ne comprends pas....

Réponses

  • CéroceCéroce Membre, Modérateur
    août 2009 modifié #2
    À mon avis sur cette ligne:

    MyDocument *document = [[NSDocumentController sharedDocumentController] currentDocument];
    


    sharedDocumentController ou currentDocument renvoie nil.
    Je me suis souvent rendu compte que le document ne devient courant que lorsque sa fenêtre est mise au premier plan, c'est à  dire pas dans -awakeFromNib, mais après.

    Ce que je veux dire, c'est qu'il est possible que les vues aient été insérées avant l'affichage de la fenêtre. Pas de meilleure explication.
  • Nebuchad34Nebuchad34 Membre
    19:25 modifié #3
    Je me suis dis la même chose, du coup, j'ai déclenché les évènements non plus dans le awakeFormNib mais dans le windowControllerDidLoadNib.... et aça ne marche pas non plus.

    Mais je pense que c'est effectivement là  que se trouve le probleme.
    Après ej ne sais pas comment le régler.
  • Nebuchad34Nebuchad34 Membre
    19:25 modifié #4
    Problem solved !  :)

    J'envoi une notification (j'adooooore les notifications) après que mon SourceListController est ajouté ma vue à  ma documentWindow,

    mon viewController capte la notification, et je n'ai plsu qu'à  faire
    myTournament = [[[[self view] window] windowController] document];
    pour être sûr de récupérer le document à  chaque fois.

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