NSTextView + NSAttributedString

21:30 modifié dans API AppKit #1
Hello à  tous,
Voilà , j'ai un MyDocument.h, je déclare un textView dedans..
J'ai une subclass windowController nommée ModController
J'ai une sublcass de mon textView..
En gros, depuis ModController, je veux remplir mon textView avec un fichier RTF situé dans le mainBundle
string est un NSAttributedString
RTFTextViewController est la subclass NSTextView
<br />string = [[[NSAttributedString alloc] initWithPath:[[NSBundle mainBundle] pathForResource:@&quot;lettre-motivation1&quot; ofType:@&quot;rtf&quot;] documentAttributes:nil] retain];<br />if(!viewController){<br />	viewController = [[RTFTextViewController alloc] init];<br />}<br />[[viewController textStorage] setAttributedString:string];<br />

Pas d'erreurs... mais rien ne se passe
Y'a juste un warning comme quoi viewController may not respond to textStorage mais je pense qu'il faut pas faire gaffe parce que si on met
[viewController aVoid];
et que dans RTFTextViewController on rajoute un
- (void)aVoid{<br /> NSLog(@&quot;test&quot;);<br />}
Tout fonctionnera parfaitement, le log s'affichera alors que Xcode aura mis un warning !
Bref si quelqu'un sait comment je peux faire pour remplir ce NSTextView... Merci

Réponses

  • fouffouf Membre
    21:30 modifié #2
    Essaye de faire la même chose mais sans sous-classe de NSTextView. Si ca marche, c'est qu'il ya un problème dans la déclaration de ta sous-classe.

    Sinon, un conseil : ne met pas de retain après le alloc. Tu risques d'avoir un pb lors de la déallocation.
  • 21:30 modifié #3
    un autorelease alors ?
    En fait j'avais déjà  essayé directement vers le MyDocument avec un NSAttributedString partagé
    ducoup j'avais fait dans ModController.m :
    <br />string = [NSAttributedString ... etc...];<br />if(!myDoc){<br />myDoc = [[MyDocument alloc] init];<br />}<br />[myDoc aVoid];
    

    Dans MyDocument.m :
    - (void)aVoid{<br />NSLog(@&quot;%@&quot;, string);<br />[[textView textStorage] setAttributedString:string];<br />}
    

    Le NSLog affiche le contenu du RTF mais le textView ne se remplie pas ! :o
    Le "string" partagé est déclaré dans ModController.h à  ce moment :
    #import &lt;Cocoa/Cocoa.h&gt;<br /><br />NSAttributedString *string;<br />@class RTFTextViewController;<br />@interface ModController : NSWindowController {
    

    Ainsi en faisant un simple import ds une autre classe, "string" est reconnu
  • fouffouf Membre
    21:30 modifié #4
    C'est normal que ce ne marche pas pour la duexième solution car tu crées un nouveau document mais tu ne l'affiches pas.

    Ensuite, tu ne déclares pas string au bon endroit. Il faut que tu le mettes entre les accolades du fichier .h.

    Dans modController.m, tu mets :
    string = [NSAttributedString ... etc...];<br />[[textView textStorage] setAttributedString:string];<br />
    


    Normalement, ca marche si tu as défini le textView comme un IBOutlet.

    Au pire, tu n'as qu'à  nous passer le code.
  • 21:30 modifié #5
    Ben si je déclare un NSTextView ds un sous classe de windowController c'est pas très bon.. d'autant plus que pour que ta technique marche, il faudrait que je connecte l'outlet textView de ModController au NSTextView de MyDocument.nib.. Donc pas trop net :/ soit, j'ai fai ça, j'ai instiante ModController ds MyDocument.nib et relié l'outlet textViewRTF au  NSTextView dans lequel l'attributedString doit d'afficher.. Ok, je build, je clique... rien :o
  • 21:30 modifié #6
    Et au fait, pour la 2eme solution, ça marchait bien, si je veux que "string" soit partagé par toutes mes classes, il faut le déclarer avant
    @implementation MaClasse : NSClass{
    

    La preuve que ça marchait : Le NSLog que j'ai mi ds MyDocument.m affiche bien le contenu de "string" qui est pourtant déclaré dans ModController.m

    Merci de m'aider quand même Fouf  ;)
  • fouffouf Membre
    21:30 modifié #7
    En fait, je ne comprends pas pkoi tu as un NSWindowController et un NSDocument. C'est plus facile de tout mettre dans le NSDocument, non ?
  • 21:30 modifié #8
    Non car ds un MyDocument tu remarqueras par exemple :
    Je crée un bouton qui ouvrira la fenetre que je veux et qui se trouve ds myDocument.. je clique, ok j'ai ma fenetre
    je fais "nouveau document" je re-clique,  hop une 2eme fenetre  :o c'est horrible surtout quand 1 seule suffit pour ce que je veux faire
  • fouffouf Membre
    21:30 modifié #9
    Voila ce que j'ai fait avec le projet que tu m'as donné.

    [Fichier joint supprimé par l'administrateur]
  • 21:30 modifié #10
    :kicking: :kicking: :adios!: :adios!: :adios!:
    Bravo Mister Fouf !
    Merci bcp
Connectez-vous ou Inscrivez-vous pour répondre.