0

NSCoding と NSKeyedArchiver を使用して、ドキュメント フォルダーに画像を保存しようとしています。アプリは次のように機能します。ユーザーは写真を撮り、プレビューを見て、画像を保存し、ギャラリー セクションで画像を見ることができます。複数の画像を同時に保存しません。

クラッシュが発生し、画像のアーカイブが間違っているのか、写真クラスの設定が不適切なのか、アーカイブ解除のコードが間違っているのかわかりません。最終的には、オブジェクトを取得し、それらを使用してコレクション ビューを作成する必要があります。

コードを呼び出してオブジェクトをロードすると、次のようなクラッシュが発生します

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[ImageForArchiving countByEnumeratingWithState:objects:count:]: unrecognized selector sent to instance 0x174232da0' *** First throw call stack: (0x18533c22c 0x196fb00e4 0x1853432f4 0x1853400a8 0x18524296c 0x10001aefc 0x189ded1ec 0x189dd62c8 0x189decb88 0x189dec814 0x189de5d50 0x189db8f74 0x18a05a124 0x189db7488 0x1852f3f8c 0x1852f3230 0x1852f12e0 0x18521cf74 0x18ec7f6fc 0x189e1ed94 0x10001840c 0x19765aa08) libc++abi.dylib: terminating with uncaught exception of type NSException

私のサブクラスコードは次のようになります。ImageForArchiving は NSCoder プロトコルに準拠しています。

ImageForArchiving.h

    @interface ImageForArchiving : NSObject <NSCoding>

@property (strong) NSDate *date;
@property (strong) NSData *imageData;

+ (ImageForArchiving *)createImageWithImage:(NSData*)data andDate:(NSDate*)date;
-(void)encodeWithCoder:(NSCoder *)aCoder;
-(id)initWithCoder:(NSCoder *)aDecoder;

@終わり

ImageForArchiving.m

@implementation ImageForArchiving

+ (ImageForArchiving *)createImageWithImage:(NSData*)data andDate:(NSDate*)date {

    ImageForArchiving *archiveImage = [[ImageForArchiving alloc] init];

    [archiveImage setDate:date];
    [archiveImage setImageData:data];

    return archiveImage;
}

- (id) initWithCoder: (NSCoder *)coder
{
    if (self = [super init])
    {
        [self setDate: [coder decodeObjectForKey:@"date"]];
        [self setImageData: [coder decodeObjectForKey:@"image"]];

    }
    return self;
}

- (void) encodeWithCoder: (NSCoder *)coder
{

    [coder encodeObject:self.date forKey:@"date"];
    [coder encodeObject:self.imageData forKey:@"image"];

}

@end

アーカイブ用のコードは、ユーザーが写真を撮った後に表示するプレビュー VC にあります。ブロックでセグエからポップされたモーダルとして表示されます。

PreviewViewController.m (画像 IBAction を保存)

NSString *filePath = [self createPathForDataFile];
    NSData *pngData = UIImagePNGRepresentation(self.previewImage.image);
    NSDate *date = [NSDate date];

    ImageForArchiving *imageRecord = [ImageForArchiving createImageWithImage:pngData andDate:date];
    [self saveItemsAtFilePath:filePath andImageToArchive:imageRecord];

ファイルパスの作成

- (NSString *)createPathForDataFile
{
    NSFileManager *fileManager = [NSFileManager defaultManager];

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsPath = [paths objectAtIndex:0];


    documentsPath = [documentsPath stringByExpandingTildeInPath];
    NSError *error = nil;
    if ([fileManager fileExistsAtPath: documentsPath] == NO)
    {
        [fileManager createDirectoryAtPath:documentsPath withIntermediateDirectories:YES attributes:nil error:&error];
    }

    return [documentsPath stringByAppendingPathComponent:@"images"];
}

画像を保存する

- (void)saveItemsAtFilePath:(NSString*)filePath andImageToArchive:(ImageForArchiving*)imageRecord {

        [NSKeyedArchiver archiveRootObject:imageRecord toFile:filePath];
    }

画像の読み込み - ここでクラッシュが発生します

- (void)loadItems {
    NSString *filePath = [self createPathForDataFile];

    if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
        self.galleryItemsArray = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
    } else {
        self.galleryItemsArray = [NSMutableArray array];
    }
}
4

0 に答える 0