appel d'une méthode d'instance

sisopetronsisopetron Membre
17:33 modifié dans API AppKit #1
Bonjour,

Je poursuis l'étude du cocoa et je me retrouve confronté à  un problème que je n'arrive pas à  résoudre.

J'ai une classe Anniversaires dans laquelle j'ai écris une méthode qui s'appelle afficheAlerte:.  C'est une IBAction.  La méthode fonctionne parfaitement.

Je voudrais pouvoir appeler cette méthode à  partir d'une autre classe : AppController.  Dans ma classe AppController, j'importe le header de Anniversaires.  Mais comment dois-je faire l'appel de la méthode afficheAlerte: ?

Je pensais qu'un simple

anniversaires = [[Anniversaires alloc] init];<br />[anniversaires afficheAlerte:self];


suffirait, mais mon alerte s'affiche deux fois dans ce cas là .

Je ne trouve pas de solution pour que mon alerte ne s'affiche qu'une seule fois.

Merci d'avance pour votre aide.

Didier

Réponses

  • LexxisLexxis Membre
    17:33 modifié #2
    Salut.
    Pourrais tu mettre le code de ta classe Anniversaire ?

    La méthode employé semble correcte, mais tout dépend de ce que tu fais non seulement dans ta méthode init (classe Anniversaire) mais aussi dans AppController...
  • sisopetronsisopetron Membre
    17:33 modifié #3
    <br />- (IBAction)afficheAlerte:(id)sender {<br />	NSAlert *alerte = [[NSAlert alloc] init];<br />	[alerte addButtonWithTitle:@&quot;Ok&quot;];<br />	[alerte setMessageText:@&quot;Anniversaires à  souhaiter :&quot;];	<br />	[alerte setInformativeText:[self extraitRappelAnniversaires]];<br />	[alerte setAlertStyle:NSWarningAlertStyle];	&nbsp;  <br />	[alerte runModal];<br />}<br />
    


    Voilà  pour le code de la méthode et ci dessous l'appel à  partir de appController :

    <br />- (void)applicationDidFinishLaunching:(NSNotification *)aNotification <br />{ <br />	[splashScreen close];<br />	<br />	// on referme la fenêtre si c&#39;est demandé dans les préférences de l&#39;utilisateur.<br />	if ([[NSUserDefaults standardUserDefaults] boolForKey: @&quot;Show Window&quot;] == NO) {<br />		[window orderOut:self];<br />	}<br /><br />	<br />	// on affiche la fenêtre d&#39;alerte si demandé dans les préférences de l&#39;utilisateur<br />	if ([[NSUserDefaults standardUserDefaults] boolForKey: @&quot;Show Alert&quot;] == YES) {<br />		anniversaires = [[Anniversaires alloc] init];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [anniversaires afficheAlerte:self];<br />	}<br />} <br />
    


    Si j'ai bien compris ce que j'ai appris jusqu'ici, ma classe anniversaires est instanciée dans IB.  Serait-ce le fait que je recrée une instance de anniversaires qui ferait que ça s'affiche deux fois ?
  • LexxisLexxis Membre
    17:33 modifié #4
    Rien d'anomal apparemment...

    Si tu as effectivement déjà  instancié un objet dans IB alors peut être as fait modifié quelque chose qui appelle automatiquement ton action "afficheAlerte". Au pire, si tu ne t'en sert pas, supprime l'instance dans IB.

    Rmq:
    Je ne suis pas un grand expert, mais je me demande s'il ne faut pas un release dans ta méthode "afficheAlerte".
  • lgriffielgriffie Membre
    17:33 modifié #5
    En effet, mes habitudes de développement sur iPhone me feraient ajouté un release de la variable alerte. Maintenant, sur Mac OSX il y a le garbage collector qui peut-être activé donc ce n'est peut-être pas nécessaire ... Mais bon je pense que cela ne peut pas faire de mal de prendre de bonnes habitudes.

    dans 1274716184:

    <br />- (IBAction)afficheAlerte:(id)sender {<br />	NSAlert *alerte = [[NSAlert alloc] init];<br />	[alerte addButtonWithTitle:@&quot;Ok&quot;];<br />	[alerte setMessageText:@&quot;Anniversaires à  souhaiter :&quot;];	<br />	[alerte setInformativeText:[self extraitRappelAnniversaires]];<br />	[alerte setAlertStyle:NSWarningAlertStyle];	&nbsp;  <br />	[alerte runModal];<br /><br />&nbsp;  [alerte release];<br />}<br />
    

  • sisopetronsisopetron Membre
    17:33 modifié #6
    Le Garbage Collection est effectivement activé.  De toute façon, si je le désactive et rajoute le release de alerte, ça ne change strictement rien : toujours cet étrange double affichage.

    Merci quand même pour ton aide.

    tata !

    Didier
  • mpergandmpergand Membre
    17:33 modifié #7
    Tu crées deux instances de Anniversaires, une dans IB et une dans le code. Il y en sûrement une de trop  :)

    Mets un point d'arrêt dans la méthode afficheAlerte et tu sauras qui appelle cette méthode.
  • sisopetronsisopetron Membre
    17:33 modifié #8
    Merci pour le conseil.  Effectivement elle est instanciée deux fois.
Connectez-vous ou Inscrivez-vous pour répondre.