Lecture des données d'un fichier
npanti
Membre
Salut à tous,
Je suis occupé à lire "Cocoa Programming for Mac OS X" et j'essaye de faire le challenge 18.
Je dois créer un programme (document-based) qui permet de dessiner une forme ovale avec la souris dans une Custon View et je dois aussi pouvoir enregistrer le document.
Le problème c'est que lorsque j'ouvre un fichier rien ne s'affiche les ovales enregistrés n'apparaissent pas.
J'ai vérifié, mon fichier enregistré comprend bien le tout les objets contenu dans bezierPaths
Merci d'avance pour votre aide
Nicolas
Voici le code:
mydocument.h
mydocument.m
stretchview.h
stretchview.m
Je suis occupé à lire "Cocoa Programming for Mac OS X" et j'essaye de faire le challenge 18.
Je dois créer un programme (document-based) qui permet de dessiner une forme ovale avec la souris dans une Custon View et je dois aussi pouvoir enregistrer le document.
Le problème c'est que lorsque j'ouvre un fichier rien ne s'affiche les ovales enregistrés n'apparaissent pas.
J'ai vérifié, mon fichier enregistré comprend bien le tout les objets contenu dans bezierPaths
Merci d'avance pour votre aide
Nicolas
Voici le code:
mydocument.h
#import <Cocoa/Cocoa.h><br />@class StretchView;<br /><br />@interface MyDocument : NSDocument<br />{<br /> IBOutlet StretchView *stretchView;<br />}<br /><br />@end
mydocument.m
#import "MyDocument.h"<br />#import "StretchView.h"<br /><br />@implementation MyDocument<br /><br />- (id)init<br />{<br /> self = [super init];<br /> if (self) {<br /> <br /> // Add your subclass-specific initialization here.<br /> // If an error occurs here, send a [self release] message and return nil.<br /> <br /> }<br /> return self;<br />}<br /><br />#pragma mark window<br /><br />- (NSString *)windowNibName<br />{<br /> // Override returning the nib file name of the document<br /> // If you need to use a subclass of NSWindowController or if your document supports multiple NSWindowControllers, you should remove this method and override -makeWindowControllers instead.<br /> return @"MyDocument";<br />}<br /><br />- (void)windowControllerDidLoadNib:(NSWindowController *) aController<br />{<br /> [super windowControllerDidLoadNib:aController];<br /> // Add any code here that needs to be executed once the windowController has loaded the document's window.<br />}<br /><br />- (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError<br />{<br /> [[stretchView window] endEditingFor:nil];<br /> <br /> return [NSKeyedArchiver archivedDataWithRootObject:[stretchView bezierPaths]];<br />}<br /><br />- (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError<br />{<br /> NSMutableArray *newBezierPaths = nil;<br /> <br /> @try {<br /> newBezierPaths = [NSKeyedUnarchiver unarchiveObjectWithData:data];<br /> }<br /> @catch (NSException *e) {<br /> if (outError) {<br /> NSDictionary *d = [NSDictionary dictionaryWithObject:@"The data is corrupted." <br /> forKey:NSLocalizedFailureReasonErrorKey];<br /> *outError = [NSError errorWithDomain:NSOSStatusErrorDomain <br /> code:unimpErr <br /> userInfo:d];<br /> }<br /> }<br /> <br /> [stretchView setBezierPaths:newBezierPaths];<br /> return YES;<br />}<br /><br />@end
stretchview.h
#import <Cocoa/Cocoa.h><br /><br /><br />@interface StretchView : NSView {<br /> <br /> NSMutableArray *bezierPaths;<br /> NSPoint firstPoint;<br /> NSPoint currentPoint;<br />}<br />- (NSRect)convertToRect;<br />- (void)drawOval:(NSRect)ovalRect;<br /><br />@property (readwrite, retain) NSMutableArray *bezierPaths;<br />@end
stretchview.m
#import "StretchView.h"<br /><br /><br />@implementation StretchView<br /><br />- (id)initWithFrame:(NSRect)frame {<br /> self = [super initWithFrame:frame];<br /> if (self) {<br /> // Initialization code here.<br /> if ([bezierPaths count]) {<br /> for (NSBezierPath *sPath in bezierPaths)<br /> {<br /> [sPath fill];<br /> }<br /> }<br /> else {<br /> bezierPaths = [[NSMutableArray alloc] init];<br /> }<br /> <br /> }<br /> return self;<br />}<br /><br />- (void)drawRect:(NSRect)dirtyRect {<br /> // Drawing code here.<br /> NSRect bounds = [self bounds];<br /> [[NSColor greenColor] set];<br /> [NSBezierPath fillRect:bounds];<br /> <br /> [[NSColor blackColor] set];<br /> [self drawOval:[self convertToRect]];<br /> <br /> for (NSBezierPath *sPath in bezierPaths)<br /> {<br /> [sPath fill];<br /> }<br /> <br />}<br /><br />- (void)drawOval:(NSRect)ovalRect<br />{<br /> NSBezierPath *thePath = [NSBezierPath bezierPathWithOvalInRect:ovalRect];<br /> [bezierPaths addObject:thePath];<br />}<br /><br />- (NSRect)convertToRect<br />{<br /> float minX = MIN(firstPoint.x, currentPoint.x);<br /> float minY = MIN(firstPoint.y, currentPoint.y);<br /> float maxX = MAX(firstPoint.x, currentPoint.x);<br /> float maxY = MAX(firstPoint.y, currentPoint.y);<br /> <br /> return NSMakeRect(minX, minY, maxX - minX, maxY - minY); <br />}<br /><br />#pragma mark mouseGesture<br /><br />- (void)mouseDown:(NSEvent *)event<br />{<br /> NSPoint p = [event locationInWindow];<br /> firstPoint = [self convertPoint:p fromView:nil];<br /> currentPoint = firstPoint;<br />}<br /> <br />- (void)mouseDragged:(NSEvent *)event<br />{<br /> NSPoint p = [event locationInWindow];<br /> currentPoint = [self convertPoint:p fromView:nil];<br />}<br /> <br />- (void)mouseUp:(NSEvent *)event<br />{<br /> NSPoint p = [event locationInWindow];<br /> currentPoint = [self convertPoint:p fromView:nil];<br /> [self setNeedsDisplay:YES];<br /> <br />}<br /><br />@synthesize bezierPaths;<br /><br />@end
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Bonjour,
Met un point d'arrêt dans MyDocument et un dans StretchView. Dans le premier tu vérifies qu'il a bien un NS(Mutable)Array avec des données dedans et dans le second qu'il est toujours là quand tu en as besoin. Le fichier c'est sur le disque, le dessin c'est beaucoup plus loin..
J'ai mis un point d'arrêt dans la fonction setStretchView, la variable stretch contient bien tout les objets enregistrés mais quand j'appuie sur continuer il revient sur la fonction setStretchView et la stretch ne contient plus rien.
voici les modifications:
Au moins tu sais pourquoi il n'affiche rien Mais pourquoi y revient il avec un argument vide ? Tu as fait un binding de stretchView dans IB ou juste connecté l'outlet ?
En grisé dans le debugger tu peux voir la pile des appels et peut être, par là , savoir d'où vient ce deuxième ?
PS: ne met pas tout ton code stp, ça fait de longues pages et il faut chercher. Juste les parties intéressantes ie partout où apparaà®t stretchView
Désolé de ne pouvoir aider plus,
Tu pourrais essayer le "forum" du livre http://techstra.bignerdranch.com/Home, taper N° de page dans le champ de recherche (253 par ex). Un des commentaires donne un lien pour le code de l'exemple résolu.