RTFD qui ne marche pas ?

muqaddarmuqaddar Administrateur
12:41 modifié dans API AppKit #1
Yop,

J'ai suivi un petit tutorial et ajouté la fonction d'enregistrement en RTFD (donc avec images). Je peux glisser mes images dans le texte, il me propose alors par la suite d'enregistrer en RTFD en lieu et place de RTF, logique. J'enregistre, mais quand j'ouvre mon document, il est vide...
Pas de pb avec le RTF et le texte, ça marche.

Je mets le code des méthodes d'enregistrement/chargement:

- (void)windowControllerDidLoadNib:(NSWindowController *) aController
{
    [super windowControllerDidLoadNib:aController];
if (rtfData) {
[[textView textStorage] replaceCharactersInRange:NSMakeRange(0,[[textView string] length]) withAttributedString:rtfData];
[rtfData release];
}
[textView setAllowsUndo:YES];
[textView setImportsGraphics:YES];
}

- (BOOL)loadFileWrapperRepresentation:(NSFileWrapper *)wrapper ofType:(NSString *)type
{
if ([type isEqualToString:@Rich Text with Attachments]) {
rtfData = [[NSAttributedString alloc] initWithRTFDFileWrapper:wrapper documentAttributes:nil];
} else {
rtfData = [[NSAttributedString alloc] initWithRTF:[wrapper regularFileContents] documentAttributes:nil];
}
if (textView) {
[[textView textStorage] replaceCharactersInRange:NSMakeRange(0, [[textView string] length]) withAttributedString:rtfData];
[rtfData release];
}
return YES;
}

- (NSFileWrapper *)fileWrapperRepresentationOfType:(NSString *)type
{
NSRange range = NSMakeRange(0,[[textView string] length]);
if ([type isEqualToString:@Rich text with Attachments]) {
return textView textStorage] RTFDFileWrapperFromRange:range documentAttributes:nil];<br /> } else {<br /> NSFileWrapper* wrapper = [[NSFileWrapper alloc] initRegularFileWithContents:[textView RTFFromRange:range;
return [wrapper autorelease];
}
}


Bien entendu j'ai ajouté RTFD dans le active target.
Je pense que le pb n'est pas au chargement du fichier mais à  l'écriture.

merci

Réponses

  • CoConutsCoConuts Membre
    12:41 modifié #2
    un rtfd est un package (dossier)

    il doit contenir

    my.rtfd

    my.rtfd/TXT.rtf
    my.rtfd/image.png

  • muqaddarmuqaddar Administrateur
    12:41 modifié #3
    Oui, mon problème, c'est qu'apparemment il ne crée pas de package.
    On dirait du rtf tout court même qd je l'enregistre en rtfd.
  • BruBru Membre
    12:41 modifié #4
    Chez moi, ton code marche...
    J'obtiens bien mon bundle rtfd qui s'ouvre correctement sous TextEdit.

    Place quelques NSLog() pour voir si tu passes bien dans le bloc if qui exécute l'enregsitrement.

    .
  • muqaddarmuqaddar Administrateur
    12:41 modifié #5
    Bien vu, Bru, après un NSLog, le if ne passait pas, une erreur de majuscule ici :

    if ([type isEqualToString:@&quot;Rich Text with Attachments&quot;])
    
  • 12:41 modifié #6
    Yup je remonte le sujet !

    Moi j'arrive à  enregistrer mais l'ouverture merde aussi, même avec TextEdit

    <br />- (void)windowControllerDidLoadNib:(NSWindowController *) aController<br />{<br />&nbsp; &nbsp; [super windowControllerDidLoadNib:aController];<br />	if(RTFData)<br />		[textView replaceCharactersInRange:NSMakeRange(0, 0) withRTF:RTFData];<br />	else if(RTFDData)<br />		[textView replaceCharactersInRange:NSMakeRange(0, 0) withRTF:RTFDData];<br />}<br /><br />- (NSData *)dataRepresentationOfType:(NSString *)aType<br />{<br />	if([aType isEqualToString:@&quot;RTF&quot;]){<br />	NSRange range = NSMakeRange(0, [[textView textStorage] length]);<br />	return [textView RTFFromRange:range];<br />	}<br />	else if([aType isEqualToString:@&quot;RTFD&quot;]){<br />	NSRange range = NSMakeRange(0, [[textView textStorage] length]);<br />	return [textView RTFDFromRange:range];<br />	}<br />}<br /><br />- (BOOL)loadDataRepresentation:(NSData *)data ofType:(NSString *)aType<br />{<br />	if([aType isEqualToString:@&quot;RTF&quot;]){<br />	if(RTFData){<br />		[RTFData release];<br />		RTFData = nil;<br />	}<br />	RTFData = [[[NSData alloc] initWithData:data] retain];<br />	}<br />	else if([aType isEqualToString:@&quot;RTFD&quot;]){<br />	if(RTFDData){<br />		[RTFDData release];<br />		RTFDData = nil;<br />	}<br />	RTFDData = [[[NSData alloc] initWithData:data] retain];<br />	}<br />	 return YES;<br />}
    


    o:)
  • 12:41 modifié #7
    J'ai testé avec le code d'hoksitan, ça marche mais c'est pas super chiant de devoir utiliser le fileWrapper .. y aurait-il un autre moyen?
  • elfelf Membre
    12:41 modifié #8
    Le principe du RTFD est d'être un bundle donc ça ne peut pas être un simple data. Il faut utiliser les file wrapper ou bien NSFileManager et des création/déplacement/etc. de chaque fichier du bundle à  la main
  • 12:41 modifié #9
    C'est bon j'ai capté depuis longtemps :p En fait c'est simple le wrapper, c'est que j'avais peur de faire connaissance avec :p
Connectez-vous ou Inscrivez-vous pour répondre.