[Réglé] Perte du contenu lors de la demande du premier enregistrement !

wiskywisky Membre
octobre 2009 modifié dans API AppKit #1
Bonjour à  tous !

J'ai une application document based sur 10.5 qui a la mauvaise manie de vider un nouveau document lors du premier enregistrement.
Voici la démarche :
1) je crée un nouveau document : file >> New
2) je le modifie...
3) je veux l'enregistrer : file >> Save
Sauf que là  avant même d'avoir la fenêtre d'enregistrement le contenu du fichier à  disparu et le fichier enregistré est vide !
J'y ai regardé de plus près (grâce au pas à  pas du débug) et j'ai remarqué qu'il créai un nouveau document vierge avant d'enregistrer !
Quelqu'un aurait-il une idée du bug ?  :why?: :why?: :why?:

Réponses

  • CéroceCéroce Membre, Modérateur
    octobre 2009 modifié #2
    le contenu du fichier à  disparu

    Qu'est ce que ça veut dire exactement ? La fenêtre est fermée, l'icône a disparu du bureau ?

    Remarque que ce ne sont pas les mêmes méthodes d'init qui sont appelées quand tu crées un nouveau document (ou autre objet) et quand tu le charges.
    Tu as peut-être une différence entre une méthode init et initWithCoder:
  • wiskywisky Membre
    00:00 modifié #3
    C'est un éditeur de texte ! J'ai écrit mon texte et je veux l'enregistrer. Je vais dans le menu Fichier puis Enregistrer mais avant que la fenêtre d'enregistrement apparaisse, le texte que j'ai saisie dans la zone de texte à  disparu.

    J'ai mis les images écran. Elle sont d'en l'ordre.
  • CéroceCéroce Membre, Modérateur
    00:00 modifié #4
    C'est impossible de te répondre sans voir le code.

    Si l'écran et le fichier sont tous les deux vides, a priori, le problème ne provient pas de l'affichage, mais de la couche "données". Quand la commande Save est utilisée, tu dois faire quelque chose qui désalloue ces données ou modifie les pointeurs sur les données.
  • wiskywisky Membre
    00:00 modifié #5
    J'ai remarqué en faisant un débug en pas à  pas qu'il éxécutait le initWithDocument de ma sous-class de NSDocument. En clair il ouvre un deuxième document mais le met à  la place du premier !
    Cela ne ce produit que pour les nouveaux fichiers. Il y a beaucoup de class et sous-class ce qui rend le débug assez difficile même pour savoir le bout de code qui merde !

    Donc : le menu Save pointe vers saveDocument: du firstResponder.
    Dans ma sous classe de NSDocument j'ai donc mis :
    - (IBAction)saveDocument:(id)sender{<br />	NSLog(@&quot;SaveDocument !&quot;);<br />	[super saveDocument:sender];<br />}
    


    A ce moment là  l'effacement n'est pas encore fait ! c'est lors de l'appel de "[super saveDocument:sender];"

    Sinon, j'utilise la fonction suivante pour retourner les données à  sauvegarder :
    - (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError<br />{<br />&nbsp;  <br />	NSString * s = [textView string];<br />	<br />	NSData * data = [s dataUsingEncoding:NSUTF8StringEncoding];<br />	<br />&nbsp; &nbsp; if ( outError != NULL ) {<br />		*outError = [NSError errorWithDomain:NSOSStatusErrorDomain code:unimpErr userInfo:NULL];<br />	}<br />	return data;<br />}<br />
    

    Par contre là  "s" est vide !
    J'ai peu être pas fait tout ce qu'il fallait ?
  • ClicCoolClicCool Membre
    00:00 modifié #6
    Salut,

    Je me demande si c'est pas plûtot du côté de la création initiale que tu devrais chercher ...
    Es-tu bien sûr que le nouveau document soit bien créé déclaré et "retenu".
    On dirait que lors de la sauvegarde il considère qu'il n'y en a pas et fait alors ce qui aurait du l'être à  la création ...
  • wiskywisky Membre
    00:00 modifié #7
    dans 1255422199:

    Salut,

    Je me demande si c'est pas plûtot du côté de la création initiale que tu devrais chercher ...
    Es-tu bien sûr que le nouveau document soit bien créé déclaré et "retenu".
    On dirait que lors de la sauvegarde il considère qu'il n'y en a pas et fait alors ce qui aurait du l'être à  la création ...


    La création est réalisé correctement. Par contre, je regarderai si il est bien retenu !
  • wiskywisky Membre
    00:00 modifié #8
    J'ai trouvé !
    Cela vien du fait que j'utilisait awakeFromNib au lieu de
    - (void)windowControllerDidLoadNib:(NSWindowController *)aController
    Pour savoir quand le chargement était fini !
  • ClicCoolClicCool Membre
    00:00 modifié #9
    Content que tu ai trouvé.



    Ca venait bien du début donc.
  • wiskywisky Membre
    00:00 modifié #10
    Oui, mais j'étais loin d'imaginer qu'il pouvait appeler plusieurs fois awakefromNib !
  • CéroceCéroce Membre, Modérateur
    00:00 modifié #11
    dans 1255625597:

    Oui, mais j'étais loin d'imaginer qu'il pouvait appeler plusieurs fois awakefromNib !


    Euh, ben, à  chaque fois que les objects contenus dans le nib instanciés...
    Je t'avoue que je ne comprends pas bien ce qui change en déplaçant le code dans windowControllerDidLoadNib:
  • wiskywisky Membre
    00:00 modifié #12
    Moi non, plus ! Cependant les faits sont là  ! Cela fonctionne maintenant !
Connectez-vous ou Inscrivez-vous pour répondre.