1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Problem mit NSView Subclass

Dieses Thema im Forum "OS X-Developer" wurde erstellt von Nohr, 28.07.09.

  1. Nohr

    Nohr Empire

    Dabei seit:
    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
     
  2. MacApple

    MacApple Lord Grosvenor

    Dabei seit:
    05.01.04
    Beiträge:
    3.470
    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
     
  3. Nohr

    Nohr Empire

    Dabei seit:
    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!
     
    #3 Nohr, 28.07.09
    Zuletzt bearbeitet: 29.07.09

Diese Seite empfehlen