• Das kreative Thema des Monats Oktober wird vor allem diejenigen unter Euch besonders ansprechen, denen Do-it-yourself quasi im Blut liegt. Zeigt uns Eure Improvisationskünste oder fotografiert, was andere Leute sich so im Alltag zusammengestrickt haben. --> Zum Mitmachen bitte hier klicken

Problem mit NSView Subclass

Nohr

Empire
Registriert
03.02.09
Beiträge
87
Servus, hab mich im Forum und auf anderen Seiten bereits totgesucht aber scheinbar bin ich der einzige der die nicht schafft :(

Also es geht um die Chapter 18 Challenge im Hillegass Buch:
document-based application that allows the user to draw ovals in arbitrary locations und size.
Gezeichnet wird mit + (NSBezierPath *)bezierPathWithOvalInRect:(NSRect)rect;
Dazu kommt speichern, laden und undo.

Gut nach langem try & error hab ich alles bis auf laden und speichern hinbekommen.

Gezeichnet wird in einer CustomView die meiner eigenen Klasse "StretchView" entspricht. In dieser Klasse befindet sich ein NSMutableArray dass die NSBezierPaths hält.

Das sind die NSCoding Methoden des NSView Subviews, bezierPaths ist das NSMutableArray
Code:
#pragma mark NSCoding Methods
- (id)initWithCoder:(NSCoder *)coder
{
	NSLog(@"initWithCoder:");
	[super initWithCoder:coder];
	bezierPaths = [[coder decodeObjectForKey:@"bezierPaths"] retain];	
	return self;
}

-(void)encodeWithCoder:(NSCoder *)coder
{
	[super encodeWithCoder:coder];
	[coder encodeObject:bezierPaths forKey:@"bezierPaths"];
}

In MyDocument halte ich mit einem ObjectController eine Referenz auf meine StretchView. Dort schreibe ich diese auch in die Datei bzw lade diese.
Errorhandling hab ich mal rausgelöscht wg Platzgründen
Code:
- (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError
{
    return [NSKeyedArchiver archivedDataWithRootObject:stretchView];

}

- (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError
{
    NSLog(@"readFromData:");
    stretchView = [NSKeyedUnarchiver unarchiveObjectWithData:data];
    return YES;
}

Resultat:
Sofern ich den Speicherdialog auswähle speichert er mir eine Datei ab. Lade ich diese jedoch wieder, so öffnet sich ein neues leeres Fenster.
Der decodierte Wert für das Array enthält nichts. -> Also dürfte das Problem beim abspeichern liegen.

Bin schon am verzweifeln, sitz seit 2 Tagen an der Aufgabe und hab es zigfach mit den Kapiteln davor abgeglichen. Kenn mich nichtmehr aus.
Falls ich ne wichtige Methode vergessen hab füg ich die natürlich gleich an.

Bitte bitte helft mir :)
mfg
 
Sofern ich den Speicherdialog auswähle speichert er mir eine Datei ab. Lade ich diese jedoch wieder, so öffnet sich ein neues leeres Fenster.
Der decodierte Wert für das Array enthält nichts. -> Also dürfte das Problem beim abspeichern liegen.
Nein, das Speichern ist nicht das Problem. Das Problem ist, dass der wieder geladene und "unarchivierte" View nicht in der View Hierarchie eingehängt ist und somit gar nicht auf dem Bildschirm erscheint.

Ich glaube auch nicht, dass Hillegass darauf hinaus wollte, dass Du den kompletten View archivierst und abspeicherst. Das entspricht nämlich nicht dem Model-View-Controller Konzept. Speicher nur das Modell ab, was hier nur das Array mit den Bezierpfaden ist.

MacApple
 
Hallo MacApple

Ich setz mich da gleich ran wenn ich Zeit hab und probier das mal!

Vielen Dank schonmal :-D
mfg

__
Edit:
Hab nun eine eigene Klasse Oval erstellt und das Array in MyDocument verwaltet. Funktioniert danke!
 
Zuletzt bearbeitet: