Petits problèmes liés au multinib.
Nebuchad34
Membre
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....
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....
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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.
Mais je pense que c'est effectivement là que se trouve le probleme.
Après ej ne sais pas comment le régler.
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 !