Quitter une appli à  la fermeture de sa fenêtre

TiffTiff Membre
13:28 modifié dans API AppKit #1
Je voudrais que mon appli, Cocoa sans document, quitte lorsque je ferme sa fenêtre principale.
Après avoir créé un outlet app, dirigé vers File's Owner, j'ai tapé dans AppController.m :
-(void)windowWillClose: (NSNotification *)aNotification {<br />   [app terminate: self]; }

Existe-t-il un moyen plus élégant ?

Réponses

  • mpergandmpergand Membre
    13:28 modifié #2
    Oui, dans l'objet délégué de NSApplication, faire:

    public boolean applicationShouldTerminateAfterLastWindowClosed(NSApplication theApplication)
    {
    return true;
    }
  • TiffTiff Membre
    13:28 modifié #3
    o:)
  • muqaddarmuqaddar Administrateur
    13:28 modifié #4
    Merci mpergand !
    ça tombe à  pic pour moi aussi ;-)
  • TiffTiff Membre
    13:28 modifié #5
    ça donne ça :
    - (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)theApplication {<br />  return YES; }<br />     <br />- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender {<br /> [self sauvegarde];<br />        return NSTerminateNow; }<br /><br />- (void)sauvegarde {<br />  // enregistrer les données avant de quitter<br />       }
    
  • ClicCoolClicCool Membre
    13:28 modifié #6
    dans 1096104576:

    ça donne ça :
    - (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)theApplication {<br />        return YES; }<br />     <br />- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender {<br /> [self sauvegarde];<br />        return NSTerminateNow; }<br /><br />- (void)sauvegarde {<br />  // enregistrer les données avant de quitter<br />       }
    



    Il me semble que comme ça ce serait plus sur:
    - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender {<br />    if ([self sauvegarde]) {<br />          return NSTerminateNow; }<br />  else {<br />            // Avec ici une dernière vérif (disque saturé etc...) avec un<br />             // Message d&#39;alerte de sauvegarde non faite demandant si l&#39;utilisateur confirme quand même de quitter<br />   }<br />}<br /><br />- (BOOL)sauvegarde {<br />  BOOL succès;<br />      // enregistrer les données avant de quitter<br />       return succes;<br />}
    
  • TiffTiff Membre
    13:28 modifié #7
    Ah ! ça fait longtemps qu'il ne m'avait pas embêté celui-là  ! Toujours à  couper les cheveux en quatre ? O0
    <br />BOOL succes;<br />[NSArchiver archiveRootObject: maListe toFile: monFichier];<br />succes = YES;<br />return succes;
    

    Je suppose qu'il y a moyen de vérifier que l'Archiver a bien fait son boulot avant de retourner YES, sinon tout ce bazard n' a aucun intérêt et, te connaissant, intérêt il y a. (et principal)  ;)
  • ClicCoolClicCool Membre
    13:28 modifié #8
    + (BOOL)archiveRootObject:(id)rootObject toFile:(NSString *)path

    donc:
    return [NSArchiver archiveRootObject: maListe toFile: monFichier];<br />
    
      ;)
  • TiffTiff Membre
    13:28 modifié #9
    :'(
    Pourtant j'étais allé voir la doc avant de poster mon message, histoire de t'attendre au tournant ! >:D
    archiveRootObject:toFile:
    + (BOOL)archiveRootObject:(id)rootObject toFile:(NSString *)path
    Creates a temporary instance of NSArchiver and archives rootObject by encoding it into a data object and writing the resulting data object to the file path. This convenience method invokes archivedDataWithRootObject: to get the encoded data, and then sends that data object the message writeToFile:atomically:, using path for the first argument and YES for the second. Returns YES upon success.
    See Also: + archivedDataWithRootObject:, ? writeToFile:atomically: (NSData)


    J'avais complètement zappé le
    Returns YES upon success.

    Quel mauvais !  :why?:
  • ClicCoolClicCool Membre
    13:28 modifié #10
    dans 1096120085:

    :'(
    Pourtant j'étais allé voir la doc avant de poster mon message, histoire de t'attendre au tournant ! >:D

    T'inquiètes, y'en aura beaucoups d'autres des tournants et je sens, qu'à  la vitesse où tu progresses, je vais finir par me prendre une claque dans un de ces tournants. :)
  • TiffTiff Membre
    septembre 2004 modifié #11
    C'est gentil :-*
    Mais là  j'ai un problème avec un NSLog(@toto);
    Alors mon niveau !

    [EDIT] Rien de grave, docteur, j'avais oublié le return par défaut (autre que dans le if else)

    [EDIT] Voilà  :
    - (BOOL)applicationShouldTerminateAfterLastWindowClosed: (NSApplication *)theApplication {<br />        return YES; }<br />     <br />- (NSApplicationTerminateReply)applicationShouldTerminate: (NSApplication *)sender {<br />        if ([self sauvegarde]) return NSTerminateNow;<br />     NSLog(@&quot;Eh ! Toi là -haut ! Regarde donc pourquoi je ne peux pas enregistrer !&quot;);<br />        return NSTerminateCancel; }<br /><br />- (BOOL)sauvegarde {<br />       return [NSArchiver archiveRootObject: maListe toFile: monFichier]; }
    
  • TiffTiff Membre
    13:28 modifié #12
    :'(
    J'ai ajouté un tiroir à  ma fenêtre, et mon appli et ben elle quitte plus quand je pommedoublevée !
  • mpergandmpergand Membre
    13:28 modifié #13
    dans 1096154796:

    :'(
    J'ai ajouté un tiroir à  ma fenêtre, et mon appli et ben elle quitte plus quand je pommedoublevée !


    Et oui, normal ! J'ai connu cette situation dans Creator&Type
    <br />// delegate editWindow<br /><br /> public void windowWillClose(NSNotification note)<br />          {<br />         NSWindow window=(NSWindow)note.object();<br /><br />            if(window==editWindow)          // l&#39;appli ne quitte pas si  le tiroir est ouvert !<br />                  {<br />                 fileDrawer.close();<br />                       }<br />                 <br /><br />            }<br />
    
  • TiffTiff Membre
    septembre 2004 modifié #14
    dans 1096189262:

    <br />l&#39;appli ne quitte pas si  le tiroir est ouvert !
    


    Je m'en doutais un peu. Encore une notification. Elle fait un peu double emploi avec applicationShouldTerminateAfterLastWindowClosed, mais tant pis.

    [EDIT]
    ça semble fonctionner au poil.  o:)

    [EDIT]
    ça marche même vraiment très bien. Il y a un binding entre le tableau de la vue principale et le champ texte du tiroir. Ce champ texte fini automatiquement de s'éditer avant que l'application ne quitte, ce qui fait que mon tableau est mis à  jour sans que j'ai besoin de valider le texte par un Tab ou autre.  :rose!:
Connectez-vous ou Inscrivez-vous pour répondre.