• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

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
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
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
 

Nohr

Empire
Registriert
03.02.09
Beiträge
87
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: