6

文字列、UIImageなどのさまざまなオブジェクトを含む可変配列があります。これらは次のように並べ替えられます。

例:

BugData *bug1 = [[BugData alloc]initWithTitle:@"Spider" rank:@"123" thumbImage:[UIImage imageNamed:@"1.jpeg"]];
...
...
NSMutableArray *bugs = [NSMutableArray arrayWithObjects:bug1,bug2,bug3,bug4, nil];

つまり、基本的には、さまざまなプロパティを持つオブジェクトを含む配列です。

次のコードで単一の文字列をファイルに保存しようとしましたが、正常に機能していますが、オブジェクトを含む配列を保存しようとすると、空のplistファイルが表示されます。

NSString *docsDir = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
NSString * path = [docsDir stringByAppendingPathComponent:@"data.plist"];
NSLog(@"%@",bugs); //Making sure the array is full
[bugs writeToFile:path atomically:YES];

私は何が間違っているのですか?

4

3 に答える 3

1

文字列または任意のプリミティブデータをplistに書き込む場合、直接保存できます。ただし、オブジェクトを保存しようとするときは、NSCodingを使用する必要があります。

BugDataクラスでencodeWithCoder:書き込みと読み取りを行うには、 2つのメソッドを実装する必要があります。initWithCoder:

編集:

このようなもの:要件に応じてFloatを整数、文字列、または配列に変更し、それらに適切なキーを指定します。

- (void)encodeWithCoder:(NSCoder *)coder {
    [coder encodeObject:_title forKey:@"title"];
    [coder encodeFloat:_rating forKey:@"rating"];
    NSData *image = UIImagePNGRepresentation(_thumbImage);
    [coder encodeObject:(image) forKey:@"thumbImage"];
}


- (id)initWithCoder:(NSCoder *)coder {
    _title = [coder decodeObjectForKey:@"title"];
    _rating = [coder decodeFloatForKey:@"rating"];
    NSData *image = [coder decodeObjectForKey:@"thumbImage"];
    _thumbImage = [UIImage imageWithData:image];
    return self;
}

これでも役に立ちます。

于 2012-12-10T12:57:03.213 に答える
1

以下のようにクラスに実装NSCodingしますBugData

- (void)encodeWithCoder:(NSCoder *)coder {
    [coder encodeFloat:title forKey:@"title"];
    [coder encodeFloat:rank forKey:@"rank"];
    [coder encodeObject:UIImagePNGRepresentation(thumbImage) forKey:@"thumbImageData"];
}




- (id)initWithCoder:(NSCoder *)coder {
    title = [coder decodeFloatForKey:@"title"];
    rank = [coder decodeFloatForKey:@"rank"];
    NSData *imgData = [coder decodeObjectForKey:@"thumbImageData"];
    thumbImage = [UIImage imageWithData:imgData ];
    return self;
}
于 2012-12-10T13:06:00.903 に答える
0

BugDataはNSCodingプロトコルを実装する必要があります。データをエンコードするには、次のメソッドが必要です。

- (void) encodeWithCoder: (NSCoder*) encoder;

クラスを表すNSDataオブジェクトを提供する必要がある場所(デコーダーでデコードします)。
plistを読むには、このメソッドを実装する必要があります。

-(id) initWithCoder: (NSCoder*) decoder;

デコーダーからデータを読み取り、BugDataオブジェクトを返す場所。

于 2012-12-10T12:51:47.923 に答える