PDA

View Full Version : Hello,About encoding and decoding custom View question.




phienex
Apr 10, 2012, 12:33 AM
Hello,I am freshman in here..and my english is not good, sorry . I want to encoding and decoding my custom view..But, I can't ,I had waste several month about it...Anybody can help me?thank you very much..Below is my code..

In my custom view: I define a custom view such as:
@class MyDocument;

@interface StretchView : NSView
{
NSPoint points[NUM];
NSPoint q[NUM];
NSMutableArray *rectArray;

NSPoint p1,p2,p3,p4;
NSInteger selectedSegment;
NSPoint location;

CGPoint _point1;
CGPoint _controlPoint1;
CGPoint _point2;
CGPoint _controlPoint2;

NSAffineTransform *transform;
float control;
float step;
float control2;
float step2;
IBOutlet MyDocument *document;

//draw Text:
NSTextStorage *textStorage;
NSLayoutManager *layoutManager;
NSTextContainer *textContainer;

IBOutlet NSTextField *myTextField;

@public
NSBezierPath *newPath;
NSImage *image;
}

And I want to save the custom view in MyDocument class, and I design the UI include button ,when I press button ,it can add custom view to display in window. So, In my mydocument class code:

----------

In MyDocument class:
- (id)init
{
self = [super init];
if (self) {
squiggleArray=[[NSMutableArray alloc] init];

}
return self;
}

- (NSString *)windowNibName
{

return @"MyDocument";
}

- (void)windowControllerDidLoadNib:(NSWindowController *)aController
{
[super windowControllerDidLoadNib:aController];

[stretchView setNsImageObj:image];

}

-(void)makeWindowControllers
{
MyWindowController *windowController = [[MyWindowController alloc] init];

[self addWindowController:windowController];
[windowController release];

}

-(NSArray *)squiggles
{
return [NSArray arrayWithArray:squiggleArray];
}

- (void)addSquiggle:(Squiggle *)squiggle
{
[[[self undoManager] prepareWithInvocationTarget:self] removeSquiggle:squiggle];

[squiggleArray addObject:squiggle];

[stretchView setNeedsDisplay:YES];
}

- (void)removeSquiggle:(Squiggle *)squiggle
{
[[[self undoManager] prepareWithInvocationTarget:self] addSquiggle:squiggle];

[squiggleArray removeObject:squiggle];

[stretchView setNeedsDisplay:YES];
}

- (void)startNewSquiggleWithPoint:(NSPoint)point
{
Squiggle *squiggle = [[Squiggle alloc] init];

[squiggle addPoint:point];
[self addSquiggle:squiggle];
}

- (Squiggle *)currentSquiggle
{
return [squiggleArray lastObject];
}

-(IBAction)pressBtn:(id)sender
{
myViewController = [[MyViewController alloc] initWithNibName:@"MyDocument" bundle:nil];

zFrame1 = [myViewController.view frame];

[myViewController.view setFrame:zFrame1];
[myViewController.view setFrameOrigin:nsPointViewOrigin];

press = [nsMutableView count];
[nsWindowController.window.contentView addSubview:myViewController.view];
[nsMutableView addObject:myViewController];
}

- (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError
{
NSMutableDictionary *documentDictionary = [NSMutableDictionary dictionary];

[documentDictionary setObject:[NSKeyedArchiver archivedDataWithRootObject:squiggleArray] forKey:@"squiggles"];
[documentDictionary setObject:[NSKeyedArchiver archivedDataWithRootObject:stretchView.nsImageObj] forKey:@"nsImageObj"];

StretchView *newView = [[StretchView alloc] init];

[documentDictionary setObject:[NSKeyedArchiver archivedDataWithRootObject:newView] forKey:@"newView"];

return [NSPropertyListSerialization dataFromPropertyList:documentDictionary format:NSPropertyListBinaryFormat_v1_0 errorDescription:NULL];
}

- (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError
{
NSDictionary *properties = [NSPropertyListSerialization propertyListFromData:data mutabilityOption:NSPropertyListImmutable format:NULL errorDescription:NULL];

[squiggleArray setArray:[NSKeyedUnarchiver unarchiveObjectWithData:[properties objectForKey:@"squiggles"]]];
image = (NSImage *)[NSKeyedUnarchiver unarchiveObjectWithData:[properties objectForKey:@"nsImageObj"]];

return YES;
}



IDMah
Jun 21, 2012, 01:41 PM
you don't

You don't save your view you save the data that creates your view.
and then rebuild your view with the loaded data..

I know this can be confusing.. but encode has a very limited types of things it can save.

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSCoder_Class/Reference/NSCoder.html

I basically used the Hillegass book example and adapted it..
all the objects have to know how to encode themselves to be successful.

Hope this helps but more than likely you have solved this already.