Domanda

Voglio scrivere un array di oggetti Question su file, ma in qualche modo writeToFile non sta facendo nulla.Una domanda ha un proprietario e una matrice di oggetti risposta.Una risposta ha anche un proprietario.Tutti e tre sono conformi al protocollo NSCoding (per quanto ne so).

Dal codice seguente, il risultato restituisce NO.Non ho idea di cosa sto facendo di sbagliato, dato che sto implementando NSCoding per tutto, giusto?

Question.h

#import <Foundation/Foundation.h>
#import "Owner.h"

@interface Question : NSObject <NSCoding> {
    NSString *questionId;
    NSString *questionRevision;
    NSString *text;
    NSDate *date;
    NSMutableArray *answers;
    NSString *page;
    NSNumber *questionLocation;

    Owner *owner;
}

@property (nonatomic, retain) NSString *questionId;
@property (nonatomic, retain) NSString *questionRevision;
@property (nonatomic, retain) NSString *text;
@property (nonatomic, retain) NSDate *date;
@property (nonatomic, retain) NSMutableArray *answers;
@property (nonatomic, retain) NSString *page;
@property (nonatomic, retain) NSNumber *questionLocation;
@property (nonatomic, retain) Owner *owner;

@end

<”Domanda.m

#import "Question.h"
#import "Answer.h"

@implementation Question

@synthesize questionId, questionRevision, text, date, answers, page, questionLocation, owner;

- (void)encodeWithCoder:(NSCoder *)coder
{
    //[super encodeWithCoder:coder];
    [coder encodeObject:questionId forKey:@"questionId"];
    [coder encodeObject:questionRevision forKey:@"questionRevision"];
    [coder encodeObject:text forKey:@"text"];
    [coder encodeObject:date forKey:@"date"];
    [coder encodeObject:answers forKey:@"answers"];
    [coder encodeObject:page forKey:@"page"];
    [coder encodeObject:questionLocation forKey:@"questionLocation"];
    [coder encodeObject:owner forKey:@"owner"];
}

- (id)initWithCoder:(NSCoder *)decoder
{
    //self = [super initWithCoder:decoder];
    self = [super init];
    self.questionId = [decoder decodeObjectForKey:@"questionId"];
    self.questionRevision = [decoder decodeObjectForKey:@"questionRevision"];
    self.text = [decoder decodeObjectForKey:@"text"];
    self.date = [decoder decodeObjectForKey:@"date"];
    self.answers = [decoder decodeObjectForKey:@"answers"];
    self.page = [decoder decodeObjectForKey:@"page"];
    self.questionLocation = [decoder decodeObjectForKey:@"questionLocation"];
    self.owner = [decoder decodeObjectForKey:@"owner"];
}

@end

<”Answer.h

#import <Foundation/Foundation.h>
#import "Owner.h"

@interface Answer : NSObject <NSCoding> {
    Owner *owner;
    NSString *text;
    NSDate *date;
}

@property (nonatomic, retain) Owner *owner;
@property (nonatomic, retain) NSString *text;
@property (nonatomic, retain) NSDate *date;

@end

<”Answer.m

#import "Answer.h"


@implementation Answer

@synthesize owner, text, date;

    - (void)encodeWithCoder:(NSCoder *)coder
    {
    //[super encodeWithCoder:coder];
    [coder encodeObject:owner forKey:@"owner"];
    [coder encodeObject:text forKey:@"text"];
    [coder encodeObject:date forKey:@"date"];
}

- (id)initWithCoder:(NSCoder *)decoder
{
    //self = [super initWithCoder:decoder];
    self = [super init];
    self.owner = [decoder decodeObjectForKey:@"owner"];
    self.text = [decoder decodeObjectForKey:@"text"];
    self.date = [decoder decodeObjectForKey:@"date"];
}

@end

<”Proprietario.h

#import <Foundation/Foundation.h>


@interface Owner : NSObject <NSCoding> {
    NSString *name;
    NSString *photoFileName;
}

@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSString *photoFileName;

@end

<”Proprietario.m

#import "Owner.h"


@implementation Owner

@synthesize name, photoFileName;

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

- (id)initWithCoder:(NSCoder *)decoder
{
    //self = [super initWithCoder:decoder];
    self = [super init];
    self.name = [decoder decodeObjectForKey:@"name"];
    self.photoFileName = [decoder decodeObjectForKey:@"photoFileName"];
}

@end

Riga di codice pertinente
BOOL result = [questions writeToFile:@"Users/brunoscheele/Desktop/questions.plist" atomically:YES];

È stato utile?

Soluzione

writeToFile:atomically: scrive file di elenco delle proprietà, non archivi serializzati.I tipi di elenchi di proprietà non possono essere estesi implementando NSCoding e, poiché i tuoi oggetti non sono uno dei tipi supportati dagli elenchi di proprietà, non possono essere scritti in un elenco di proprietà.

Per archiviare i tuoi oggetti, dovrai utilizzare un NSAchiver, ad esempio:

[NSKeyedArchiver archiveRootObject:questions 
                 toFile:@"some/path/questions.archive"]

Altri suggerimenti

Tratto da qui NSMutableArray writeToFile: atomicamente restituisce sempre NO sul dispositivo ma funziona benesul simulatore

Non penso che tu non possa scrivere nel bundle dell'applicazione, quindi non puoi scrivere in un plist nella directory Resources.Un buon modo è copiare il plist dalla directory Resource nella directory Documents al primo avvio e accedervi da lì in futuro ..

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top