iPhone / Objective-C: NSMutableArray writeToFile schreibt nicht in die Datei. Immer gibt KEINE
Ich versuche zu serialisieren zwei NSMutableArrays
von NSObjects
dass die Umsetzung der NSCoding
Protokoll. Aber es funktioniert für einen (stacks
) und nicht die andere (cards
). Ich habe den folgenden code-block:
-(void) saveCards
{
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString* documentsDirectory = [paths objectAtIndex:0];
NSString* cardsFile = [documentsDirectory stringByAppendingPathComponent:@"cards.state"];
NSString* stacksFile = [documentsDirectory stringByAppendingPathComponent:@"stacks.state"];
BOOL c = [rootStack.cards writeToFile:cardsFile atomically:YES];
BOOL s = [rootStack.stacks writeToFile:stacksFile atomically:YES];
}
Ich Schritt durch diese Methode den debugger, und nachdem die letzten beiden Zeilen code ausgeführt wird, überprüfe ich die Werte der beiden BOOL
s. BOOL c
ist NO
und BOOL s
ist YES
. Die stacks
array ist tatsächlich leer ist (das ist wahrscheinlich, warum es funktioniert). Die cards
array-Inhalte hat. Warum ist es, dass das array mit dem Inhalt der ausfällt? Ich kann nicht dieses heraus. Habe ich mich durch zahlreiche threads auf SOF, jeder von Ihnen sagen, das problem ist, weil der Schutz der Dateien, die Sie schrieben, waren Sie daran zu hindern, zu schreiben. Das ist nicht mein problem, wie Schreibe ich den Ordner "Dokumente". Ich habe doppelt und dreifach geprüft, dass weder rootStack.cards
noch rootStack.stacks
ist null. Und ich habe überprüft, dass die Karten in der Tat haben sich Inhalte.
Hier sind die coder Methoden für meine Notecard Klasse (ich fügte hinzu, alle if
- Statements als Teil versuchen, dieses problem zu lösen, stellen Sie sicher, dass Sie versuchen zu codieren, null-Werte nicht etwas zu brechen):
-(void) encodeWithCoder:(NSCoder *)encoder
{
if(text)
[encoder encodeObject:text forKey:@"text"];
if(backText)
[encoder encodeObject:backText forKey:@"backText"];
if(x)
[encoder encodeObject:x forKey:@"x"];
if(y)
[encoder encodeObject:y forKey:@"y"];
if(width)
[encoder encodeObject:width forKey:@"width"];
if(height)
[encoder encodeObject:height forKey:@"height"];
if(timeCreated)
[encoder encodeObject:timeCreated forKey:@"timeCreated"];
if(audioManagerTicket)
[encoder encodeObject:audioManagerTicket forKey:@"audioManagerTicket"];
if(backgroundColor)
[encoder encodeObject:backgroundColor forKey:@"backgroundColor"];
}
-(id) initWithCoder:(NSCoder *)decoder
{
self = [super init];
if(!self)
return nil;
self.text = [decoder decodeObjectForKey:@"text"];
self.backText = [decoder decodeObjectForKey:@"backText"];
self.x = [decoder decodeObjectForKey:@"x"];
self.y = [decoder decodeObjectForKey:@"y"];
self.width = [decoder decodeObjectForKey:@"width"];
self.height = [decoder decodeObjectForKey:@"height"];
self.timeCreated = [decoder decodeObjectForKey:@"timeCreated"];
self.audioManagerTicket = [decoder decodeObjectForKey:@"audioManagerTicket"];
self.backgroundColor = [decoder decodeObjectForKey:@"backgroundColor"];
return self;
}
jedes Feld ist entweder ein NSString, NSNumber, oder UIColor.
Vielen Dank für jede Hilfe
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du verwechselst property-Listen mit der Archivierung. Es ist einfach zu tun.
writeToFile:atomically:
erfordert, dass die Inhalte in das Eigentum der Liste kompatibel; das heißt, alle Objekte im array eine Instanz von einer der Klassen erlaubt, die in property-Listen (dictionaries, strings, Daten, arrays, etc...).Finden Sie unter: writeToFile:atomar:'s-Dokumentation.
Was Sie wollen, ist
NSArchiver
und, genauer gesagt, zu Lesen Archivierung guide.Den
writeToFile:atomically:
Methode aufNSMutableArray
Sie anrufen funktioniert nur, wenn alle Elemente der array-Eigenschaft list-Objekte (NSString
,NSData
,NSArray
oderNSDictionary
Objekte.) Es tut NSPropertyListSerialization. Dies ist nicht das gleiche wie die Kraft-Archivierung erfolgt mittels NSKeyedArchiver und das NSCoding-Protokoll. Finden Sie die Archive und Serialisierung Guide für Cocoa für details.Das spezifische problem hier ist, dass
UIColor
ist nicht eine Eigenschaft list-Objekt. Es erlaubt jedoch die Umsetzung derNSCoding
Protokoll und sollte in ein Archiv. Versuchen Sie so etwas wie