NSCoding メソッドに問題があります。カスタム クラスを保存すると、すべて問題ないように見えます。実際に.plist
は、ドキュメント ディレクトリにファイルが作成されます。このファイルには、NSMutableArray
私のカスタム オブジェクトがすべて含まれています。
これが私のカスタムオブジェクトのインターフェースと実装です
.h
@interface CustomObj : NSObject <NSCoding>
.m
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject: _titleCobj forKey:@"Title"];
[aCoder encodeObject: _typeCobj forKey:@"Type"];
[aCoder encodeObject: _imageCobj forKey:@"Image"];
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super init];
if (self) {
NSString *title = [aDecoder decodeObjectForKey:@"Title"];
self.titleCobj = title;
NSString *type = [aDecoder decodeObjectForKey:@"Type"];
self.typeCobj = type;
UIImage *image = [aDecoder decodeObjectForKey:@"Image"];
self.imageCobj = image;
}
return self;
}
ドキュメントディレクトリのパスを見つけるために使用するコードは次のとおりです
- (NSString *)documentsDirectory
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
return documentsDirectory;
}
- (NSString *)dataFilePath
{
return [[self documentsDirectory] stringByAppendingPathComponent:@"Favorites.plist"];
}
ここでは代わりに、データを保存およびロードするための 2 つの方法
- (void)load
{
NSString *path = [self dataFilePath];
if ([[NSFileManager defaultManager] fileExistsAtPath:path])
{
NSLog (@"<__________________________LOADING__________________________>");
NSData *data = [[NSData alloc] initWithContentsOfFile:path];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
self.favorites = [unarchiver decodeObjectForKey:@"Favorites"];
[unarchiver finishDecoding];
} else {
NSLog (@"<__________________________FIRST TIME LOAD__________________________>");
self.favorites = [[NSMutableArray alloc] initWithCapacity:20];
}
}
- (void)save
{
NSMutableData *data = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver encodeObject:_favorites forKey:@"Favorites"];
[archiver finishEncoding];
[data writeToFile:[self dataFilePath] atomically:YES];
}
私のアプリには 2 つの TableViewController があります。
2つのカスタムオブジェクトを持つtableView(両方のオブジェクトについて、セルには画像、タイトル付きのラベル、タイプ付きのラベルが表示されます)、セルをクリックすると、そのオブジェクトが「お気に入りリスト」に自動的に保存されます。
およびお気に入りの配列をロードする tableView。配列をロードすると、実際には、以前に保存した正しい数のカスタム オブジェクトが含まれています。
しかし、ログから、何か奇妙なことが起こることがわかりました:
2012-04-15 20:37:52.910 Fav[565:15803] ESISTE un file e l'instance dell'array è ---> (
"<CustomObj: 0x806d790>",
"<CustomObj: 0x806d850>",
"<CustomObj: 0x806d830>",
"<CustomObj: 0x806d9d0>",
"<CustomObj: 0x806d9d0>",
)
2012-04-15 20:37:52.910 Fav[565:15803] L'array was loaded, and it is composed by --> 5 objects
2012-04-15 20:37:52.912 Fav[565:15803] INSTANCE CustObj PER CELLA - NUMERO #0_______________
2012-04-15 20:37:52.912 Fav[565:15803] NUOVA INSTANCE - Instance title --> (null)
2012-04-15 20:37:52.912 Fav[565:15803] NUOVA INSTANCE - Instance type --> (null)
2012-04-15 20:37:52.913 Fav[565:15803] NUOVA INSTANCE - Instance image --> (null)
2012-04-15 20:37:52.914 Fav[565:15803] INSTANCE CustObj PER CELLA - NUMERO #1_______________
2012-04-15 20:37:52.914 Fav[565:15803] NUOVA INSTANCE - Instance title --> (null)
2012-04-15 20:37:52.914 Fav[565:15803] NUOVA INSTANCE - Instance type --> (null)
2012-04-15 20:37:52.914 Fav[565:15803] NUOVA INSTANCE - Instance image --> (null)
2012-04-15 20:37:52.915 Fav[565:15803] INSTANCE CustObj PER CELLA - NUMERO #2_______________
2012-04-15 20:37:52.915 Fav[565:15803] NUOVA INSTANCE - Instance title --> (null)
2012-04-15 20:37:52.915 Fav[565:15803] NUOVA INSTANCE - Instance type --> (null)
2012-04-15 20:37:52.916 Fav[565:15803] NUOVA INSTANCE - Instance image --> (null)
2012-04-15 20:37:52.916 Fav[565:15803] INSTANCE CustObj PER CELLA - NUMERO #3_______________
2012-04-15 20:37:52.917 Fav[565:15803] NUOVA INSTANCE - Instance title --> (null)
2012-04-15 20:37:52.917 Fav[565:15803] NUOVA INSTANCE - Instance type --> (null)
2012-04-15 20:37:52.917 Fav[565:15803] NUOVA INSTANCE - Instance image --> <UIImage: 0x843acf0>
2012-04-15 20:37:52.917 Fav[565:15803] INSTANCE CustObj PER CELLA - NUMERO #4_______________
2012-04-15 20:37:52.918 Fav[565:15803] NUOVA INSTANCE - Instance title --> (null)
2012-04-15 20:37:52.918 Fav[565:15803] NUOVA INSTANCE - Instance type --> (null)
2012-04-15 20:37:52.918 Fav[565:15803] NUOVA INSTANCE - Instance image --> <UIImage: 0x843acf0>
なぜすべてivars
の mycustomObj
が nil なのか理解できませんでしたが、最後の 2 つのインスタンスには、実際には Images がありますか? 私のオブジェクトは同じですが、実際に画像を読み込んでtableView
.
エンコーダーで何か悪いことをしているとしか思えません。私は答えを前もって本当にありがとう:)