windowDidLoad ne se lance pas...
chaps31
Membre
Bonjour,
J'ai lu ici que je ne suis pas le seul à me heurter à ce problème. J'ai une fenêtre dans mon XIB avec un referencing outlet window bien lié à mon controller, de même celui-ci est bien lié en tant que delegate, jusque là tout va bien mais là où ça se corse c'est que bien que ma fenêtre s'ouvre, visiblement le (void)windowDidLoad ne se lance pas... J'ai mis un NSLog pour être certain et ça confirme... Alors que le (id)initWithWindow:(NSWindow *)window fonctionne très bien...
C'est incompréhensible... Vous avez une solution ou une explication ?
Au passage ces 2 méthodes créées avec le windowController ne sont pas dans le .h, c'est normal j'imagine... bien que je ne sache pas pourquoi.
Merci de votre aide.
J'ai lu ici que je ne suis pas le seul à me heurter à ce problème. J'ai une fenêtre dans mon XIB avec un referencing outlet window bien lié à mon controller, de même celui-ci est bien lié en tant que delegate, jusque là tout va bien mais là où ça se corse c'est que bien que ma fenêtre s'ouvre, visiblement le (void)windowDidLoad ne se lance pas... J'ai mis un NSLog pour être certain et ça confirme... Alors que le (id)initWithWindow:(NSWindow *)window fonctionne très bien...
C'est incompréhensible... Vous avez une solution ou une explication ?
Au passage ces 2 méthodes créées avec le windowController ne sont pas dans le .h, c'est normal j'imagine... bien que je ne sache pas pourquoi.
Merci de votre aide.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Pourquoi mettre un NSLog() quand on peut mettre un point d'arrêt, qui lui, n'oblige pas à recompiler ?
Le chargement est fainéant. C'est à dire que tant qu'on ne demande pas la fenêtre, elle n'est pas chargée.
Tu peux le forcer en appelant [self window].
C'est pour cela qu'il y a une méthode -isWindowLoaded.
Dans quel .h ?
EDIT : le isWindowLoaded me confirme que ma fenêtre est bien chargée mais le windowDidLoad n'est pas lancé...
...bigre... Bon j'ai essayé close la fenêtre ne se ferme pas, donc j'ai essayé window et cela me retourne null... Donc pas de lien fait entre mon controller et ma fenêtre... Le lien : j'ai créé un objet de la classe de mon NSwindowController dans le XIB, il a un outlet "window" que j'ai lié dans le XIB à la fenêtre, il y a erreur de ma part ? Merci.
Non, je n'ai jamais dit ça. J'ai dit qu'il ne suffit pas d'initialiser un NSWindowController pour que sa fenêtre soit chargée.
Essaie de décocher la case "Visible at Launch", j'ai des souvenirs de surprises avec.
Essaie aussi d'implémenter la méthode:
- (void) awakeFromNib
dans ton contrôleur.
Elle est appelée lorsque le nib est chargé.
Au bilan :
window me retourne null, close me retourne null, mais la fenêtre est loadée... Vu mon statut d'amateur je suis certains que je fais une erreur tellement de base qu'elle ne te vient pas à l'esprit...
Donc la méthode : - (id)initWithWindow:(NSWindow *)window se lance bien mais avec window à null... tout est là ... Pourquoi ? Dans mon XIB il y a un Outlet window pour mon windowcontroller (sans d'ailleurs d'IBOutlet dans le .h du windowcontroller) que je lie graphiquement à mon NSPanel, cet Outlet est bien le "window" de la méthode précédente ?
Merci encore...
Je veux voir DU CODE.
J'ai essayé le awakeFromNib : première désillusion le -close ne ferme pas la fenêtre par contre là si je lui demande quelle fenêtre il contrôle c'est bon il m'indique mon NSPanel (toujours mes NSLog) alors qu'il m'indique null dans le - (id)initWithWindow:(NSWindow *)window et pareil dans - (void)windowDidLoad, si à la limite dans le init peut-être n'a-t'il pas le temps de "percuter" /wink.png' class='bbc_emoticon' alt=';)' /> le windowdidload qui ne se lance pas c'est incomprhensible....
Au passage dans mon code je modifie un NSpopUpButton du NSPanel, évidemment ça ne marchait pas, mais dans le awakefromnib ça marche très bien... /blink.png' class='bbc_emoticon' alt=' ' />
- Pourquoi le windowDidLoad ne marche pas...
- J'ai oublié de déclarer dans le .h le awakeFromNib, mais ça ne pose pas de problème... idem pour le windowDidLoad qui n'est pas dans le .h ou le initWithWindow... Comment c'est possible ?
Si vous avez des réponses, merci d'éclairer ma lanterne.
Il est là ton problème. Un NSWindowController sert essentiellement à charger un nib contenant une fenêtre.
Donc, si tu l'instancies dans le nib, tu ne risques pas d'avoir la méthode -windowDidLoad appelée, puisqu'elle est déjà chargée (les objets du nib ont été instanciés) !
Utilise le Window Controller correctement:
- Place la fenêtre seule dans un xib
- Mets la classe du File's Owner à ta sous-classe de NSWindowController
- Relie l'outlet window
- Instancie le window controller, par exemple dans l'AppDelegate:
J'ai créé un objet dans le NIB, j'ai créé un windowController sous XCode et j'ai déclaré comme classe de mon objet dans le NIB mon windowcontroller créé dans XCode...
Ce qui fait que je ne comprend pas pourquoi l'objet du Nib ne lance pas mon windowDidLoad, il est instancié à partir de ma classe windowController, d'après ce que tu dis l'objet se chargerait avant la fenêtre...
Merci encore.
Si tu as besoin d'un simple contrôleur, instancié dans le nib, fais-le hériter de NSObject et utilise -awakeFromNib.
- On peut donc avoir des méthodes non déclarées dans le .h ?
- Pourquoi self.windowcontroller dans l'AppDelegate, plus précisément pourquoi self. le windowcontroller est une variable d'instance de l'Appdelegate, on ne peut pas l'appeler directement sans le self. ?
PS : ne pas oublier que c'est en posant des questions stupides qu'on l'est un peu moins /wink.png' class='bbc_emoticon' alt=';)' />
Il faut que les méthodes soient connues. À partir du moment où ton objet hérite de NSWindowController, il possède forcément une méthode windowDidLoad. Pas besoin de la redéclarer dans le .h.
Note, que ça arrive quand même qu'on le fasse pour indiquer explicitement qu'on surcharge cette méthode.
Si, on peut. La différence c'est que
est équivalent à
tu passes donc par le getter.
Je comptais n'avoir qu'un Xib, c'est une erreur ?
Ensuite tu lies le controller au xib mais cela ne définit pas à quelle fenêtre... Donc pas le choix ? Un Xib par fenêtre ?
Autre chose j'ai toujours lié mes IBOutlet dans IB, là ... comment faire si mon controller n'est pas instancié dans IB ?
Mais au final mieux vaut faire comme ça ou bien créer un Xib par fenêtre de l'application ?
Oui et non.
Il est possible de n'avoir qu'un seul XIB, mais ce n'est pas super astucieux parce que tous les objets qui sont dedans sont instanciés à l'ouverture. Un cas concret est la fenêtre des préférences: finalement, on l'ouvre une fois tous les 20 lancements, alors pourquoi perdre du temps à la charger si l'utilisateur ne s'en servira pas.
Il y a une autre raison: avec un seul XIB, tu vas te retrouver avec un AppDelegate énorme.
En fait, dans une appli un peu complexe, on utilise non seulement des NSWindowController avec un XIB pour chaque fenêtre, mais aussi des NSViewControllers pour gérer des vues qui vont être insérées dans une fenêtre.
Pas le choix, le window controller ne peut gérer qu'une fenêtre. Il faut penser à connecter son outlet window vers cette NSWindow.
File's Owner (le cube orange dans le XIB) représente l'objet qui a ouvert le NIB. C'est à lui que tu vas ajouter des outlets.
Je crois que je ne compends pas bien la nuance... le initWithWindowNibName est une méthode pour le windowController, mais si j'ai plusieurs fenêtre dans mon XIB comment sait-on laquelle est gérée par le controller ? Il y a définitivement un truc qui m'échappe... Je sens que tu vas me reparler du File's owner... /wink.png' class='bbc_emoticon' alt=';)' />
initWithWindow: sert si tu as déjà créé la fenêtre par ailleurs et tu veux que le contrôleur la gère. C'est super rare de s'en servir.
Fais un XIB par fenêtre.