Problem med spara/ladda :(

Tråden skapades och har fått 15 svar. Det senaste inlägget skrevs .
1

Har lite problem med att spara o ladda i ett program som jag håller på med
Jag har ett fungerande program som ligger som egna klasser och har instanser i IB. Har kopplat en IBOutlet till min klass i IB och den stegar igenom och verkar spara den som den ska...
Men sen när jag ska loada filen så verkar den lägga upp allting som den ska när den går igenom decoder-metoderna... Men det är ändå tomma arrayer och object...

Nedan har jag koden för att ladda där _table är min IBOutlet till klassen Table... Det funkar som sagt inte men jag e rätt grön på Obj-C så jag vet inte nåt annat sätt att göra på :/

- (BOOL)loadDataRepresentation:(NSData *)data ofType:(NSString *)aType
{
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];

_Table = [unarchiver decodeObjectForKey:@Table]];

[unarchiver finishDecoding];
[unarchiver release];
return YES;

}

Här är koden för att spara oxå, o det verkar som den sparar som den ska iaf...
- (NSData *)dataRepresentationOfType:(NSString *)aType
{
NSMutableData *data = [NSMutableData data];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver setOutputFormat:NSPropertyListXMLFormat_v1_0];

[archiver encodeObject:_table forKey:@Table];

[archiver finishEncoding];
[archiver release];
return data;
}

  • Medlem
  • Stockholm
  • 2004-11-06 23:27

1) Om du kollar i din propertylist-fil, verkar din klass blivit serialiserad korrekt?

2) Returnerar decodeObjecetForKey nil eller ett korrekt objekt?

/Kalle

  • Medlem
  • 2004-11-07 00:27

Det där ser väl OK ut, men har du implementerat initWithCoder och encodeWithCoder i klassen Table?

Jag har följande kod i mina dataRepresentationOfType och loadDataRepresentation, som funkar för mig. _graphics är en NSMutableArray som innehåller instanser av klassen Graphic som implementerar initWithCoder och encodeWithCoder. Mitt program är alltså ett ritprogram

- (NSData *)dataRepresentationOfType:(NSString *)aType {
    return [NSKeyedArchiver archivedDataWithRootObject:_graphics];
}

- (BOOL)loadDataRepresentation:(NSData *)data ofType:(NSString *)aType {
	[self setGraphics:[NSKeyedUnarchiver unarchiveObjectWithData:data]];
    return YES;
}

Kanske du skulle testa använda _table som RootObject?

  • Medlem
  • 2004-11-07 01:00

Jag testade byta ut min kod i loadDataRep och dataRep mot den du angav ovan, och det funkade hur bra som helst (som en extra bonus fick jag se hur en kodad array ser ut i xml-plist-formatet, rena grekiskan). Så jag tror inte att felet ligger i koden du visade i dit inlägg.

Tack för all hjälp!! Tyvärr så funkar det fortfarande inte
Har kollat helvägen genom alla steg när dden sparar och laddar. Den sparar som den ska och den laddar oxå som den ska. Använder bindings och det är en NSObjectController som hämtar sin 'Content' från klassen Table... Måste man säga till den på nåt sätt kanske att objectet ändrats?

Lägger med koden för Table ifall det hjälper... Klasserna 'Player' och "Skill' som arrayerna innehåller object av har jag använt i andra program innan så de vet jag att de funkar...

#import "Table.h"

@implementation Table

- (id) init
{
if (self = [super init])
{
_players = [[NSMutableArray alloc] init];
_skills = [[NSMutableArray alloc] init];
}
return self;
}

- (id) initWithTable:(Table *)newTable
{
_players = [[NSMutableArray alloc] initWithArray:[newTable players]];
_skills = [[NSMutableArray alloc] initWithArray:[newTable skills]];
return self;
}

- (void) dealloc
{
[_players release];
[_skills release];
[super dealloc];
}

- (NSMutableArray *)players
{
return _players;
}

- (void) setPlayers: (NSArray *)newPlayers
{
if (_players != newPlayers)
{
[_players autorelease];
_players = [[NSMutableArray alloc] initWithArray: newPlayers];
}
}

- (NSMutableArray *)skills
{
return _skills;
}

- (void) setSkills: (NSArray *)newSkills
{
if (_skills != newSkills)
{
[_skills autorelease];
_skills = [[NSMutableArray alloc] initWithArray: newSkills];
}
}

- (void)encodeWithCoder:(NSCoder *)encoder
{
if ( [encoder allowsKeyedCoding] )
{
[encoder encodeObject:_players forKey:@Players];
[encoder encodeObject:_skills forKey:@Skills];
}
else
{
[encoder encodeObject:_players];
[encoder encodeObject:_skills];
}
}

- (id)initWithCoder:(NSCoder *)decoder
{
if ( [decoder allowsKeyedCoding] )
{
// These may be decoded in any order you like
[self setPlayers: [decoder decodeObjectForKey:@Players]];
[self setSkills: [decoder decodeObjectForKey:@Skills]];
}
else
{
// These must be decoded in the same order that they
// were encoded
[self setPlayers: [decoder decodeObject]];
[self setSkills: [decoder decodeObject]];
}
return self;
}

@end

  • Medlem
  • 2004-11-07 11:58

Det här är bara en vild gissning...

Jag hade något liknande problem och orsaken var då att objektet som filen lästes in till och objektet som presenterade innehållet (användargränsnittet) inte var samma instans. Jag hade kopplat en Outlet eller Action till fel instans i IB vilket gjorde att två olika instanser användes...

Kolla adressen på self i debuggern och se så att det är samma adress vid inläsning från fil som när du senare tittar på datat och ser att det fortfarande är tomt...

/Micke

Ursprungligen av arc:

Det här är bara en vild gissning...

Jag hade något liknande problem och orsaken var då att objektet som filen lästes in till och objektet som presenterade innehållet (användargränsnittet) inte var samma instans. Jag hade kopplat en Outlet eller Action till fel instans i IB vilket gjorde att två olika instanser användes...

Kolla adressen på self i debuggern och se så att det är samma adress vid inläsning från fil som när du senare tittar på datat och ser att det fortfarande är tomt...

/Micke

Hmmm, verkar som det är så det verkar vara.... Hur gör man för att få rätt på det?
Det enda jag kopplat är en Outlet från 'Files Owner' till klassen 'Table' som jag kallar _table
Några idéer?

  • Medlem
  • 2004-11-07 13:09
Ursprungligen av Dolleman:

Hmmm, verkar som det är så det verkar vara.... Hur gör man för att få rätt på det?
Det enda jag kopplat är en Outlet från 'Files Owner' till klassen 'Table' som jag kallar _table
Några idéer?

Måste nog veta mer om ditt projekt i sådana fall. Har du egendefinerade Controller och Document-klasser eller bara en egen Document klass? Om du har två egna klasser vilken är kopplad till File's Owner?

Har du två olika klasser ska det förstås vara olika instansadresser för Controller och Document-objekten...

/Micke

Ursprungligen av arc:

Måste nog veta mer om ditt projekt i sådana fall. Har du egendefinerade Controller och Document-klasser eller bara en egen Document klass? Om du har två egna klasser vilken är kopplad till File's Owner?

Har du två olika klasser ska det förstås vara olika instansadresser för Controller och Document-objekten...

/Micke

Har en egendefinierad Controller klass som heter Table... Resten av klasserna är kopplade till just den. Så från 'Table' är kopplad till 'Files owner', ingen annan.

Ingen alls som vet??
*Suck*
*sliter hår*

  • Medlem
  • Stockholm
  • 2004-11-12 00:30
Ursprungligen av Dolleman:

Ingen alls som vet??
*Suck*
*sliter hår*

Du sa att dina Players och Skills-klasser fungerar så jag antar att du implementerat encodeWithCoder och initWithCode i dem....

/Kalle

(är djäkligt trött så jag vet inte om detta nämnts tidigare i tråden)

EDIT: Stavar som en kråka när jag är trött...

jepp det är implementerat i dem... Och de funkar som de ska oxå, har haft dem i ett annat program innan och där så går det bra

Det kanske bara är fel inskrivet här i forumet men i ditt kodexempel har du två variabler för din Table klass, _table och _Table.

Joakim

ja jag såg det sen men det är rätt i projektet iaf
Ingen som har lust att ta en titt på projektfilen o se vad det är som är fel??
Hade varit jätteschysst och väldigt uppskattat

Ursprungligen av Dolleman:

Ingen som har lust att ta en titt på projektfilen o se vad det är som är fel??

Visst kan jag göra det om du gör den tillgänglig.

jacked jag har skickat PM till dig

1
Bevaka tråden