[Résolu] Programmation Cocoa sous Mac os X - Exercice du chapitre 12

ifouifou Membre
mai 2010 modifié dans API AppKit #1
Bonjour,

j'essaie de faire l'exercice du chapitre 12 de "Programmation Cocoa sous Mac OS X" : après avoir gérer la fenêtre Preferences dans l'application RaiseMan, l'auteur laisse en exercice le fait de faire apparaitre un simple Panel "About' en chargeant son fichier XIB à  partir du Bundle. Et j'y arrive bien: le panel s'affiche sans aucun problème. Seulement je veux aller plus loin: une fois que je ferme la fenêtre About dans l'application, je veux pouvoir la re-ouvrir en cliquant sur "About RaiseMan". Or cela ne marche pas. J'aimerais avoir votre avis sur cette question de débutant (PS: les corrections d'exercice de l'auteur n'offrent pas de correction pour cet exercice là .. :/)

J'ai associé une action à  l'entrée de menu "About RaiseMan" à  une méthode dans mon AppController (qui hérite de NSObject):
- (IBAction)showAboutPanel:(id)sender<br />{<br />	<br />	if (!aboutPanel) {<br />		BOOL success = [NSBundle loadNibNamed:@&quot;About&quot;<br />						 owner:self];<br />		NSLog(@&quot;sucess is %d&quot;, success);<br />	} else {<br />		NSLog(@&quot;aboutPanel Nib file is loaded yet&quot;);<br />		[[aboutPanel windowController] showWindow:self]; // &lt;--- CRASH LORS DE SON INVOCATION!! :-/<br />	}<br />}


aboutPanel est un outlet vers la fenêtre About. J'affecte bien la fenêtre About au first responder (qui est donc l'instance de mon AppController puisque je le passe en paramètre de -loadNibNamed:owner: .

Mon but est d'afficher la fenêtre About about alors que son fichier NIB a déjà  été chargé en mémoire auparavant. Je pensais qu'un simple showWindow: aurait suffit comme cela est fait avec la fenêtre Preferences (c'est le but du chapitre 12).
Comment faire ?

Réponses

  • 17:25 modifié #2
    Vérifie via IB que ta fenêtre n'a pas "releases when closed" de coché dans ses attributs.
  • ifouifou Membre
    mai 2010 modifié #3
    Ok merci Eaglelouk, je suis passé devant cette option des centaines de fois sans jamais y prêté attention. Je l'ai activé et au moins l'appli a fini de crashé. Maitenant l'appel à  -showWindow: sur le windowController ne faisait pas re-afficher la boite. Quelque part c'est normal, le window controller est celui passé en paramètre lors du chargement du fichier NIB par la classe NSBundle, or cette instance est une instance de ma classe AppController qui hérite de NSObject et non de NSWindowController. Elle ne risque pas de répondre au message -showWindow: .

    J'ai consulté rapidos la doc Apple sur les NSWindow et je suis tombé sur plusieurs sections intéressante. J'ai trouvé cette méthode qui m'a de suite interpellé, et j'ai modifié mon code pour tester:


    &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //[[aboutPanel windowController] showWindow:self];<br />		[aboutPanel makeKeyAndOrderFront:self];
    


    Et ça marche!! Je peux ensuite fermer la boite About, puis un clic dans le menu la fait réapparaitre à  nouveau.

    Merci pour ton coup de main :-)

    Yves 
  • PierrePierre Membre
    17:25 modifié #4
    @ifou : pense à  préciser [Résolu] dans ton sujet si il est résolu. :)

    Pierre
  • ifouifou Membre
    17:25 modifié #5
    @Pierre: done.
Connectez-vous ou Inscrivez-vous pour répondre.