5

次のように定義されたOccasionというカスタムオブジェクトがあります。

#import <Foundation/Foundation.h>


@interface Occasion : NSObject {

NSString *_title;
NSDate *_date;
NSString *_imagePath;    

}

@property (nonatomic, retain) NSString *title;
@property (nonatomic, retain) NSDate *date;
@property (nonatomic, retain) NSString *imagePath;

これで、NSUserDefaultsに保存したいNSMutableArrayofOccasionsができました。私はそれが簡単な方法では不可能であることを知っているので、それを行う最も簡単な方法はどれかと思いますか?シリアル化が答えである場合、どのように?ドキュメントを読みましたが、完全に機能する方法を理解できなかったためです。

4

3 に答える 3

11

NSKeyedArchiver配列をにシリアル化NSDataし、 に保存してから、後で逆シリアルNSUserDefaults化するために使用するようなものを使用する必要があります。NSKeyedUnarchiver

NSData *serialized = [NSKeyedArchiver archivedDataWithRootObject:myArray];
[[NSUserDefaults standardUserDefaults] setObject:serialized forKey:@"myKey"];

//...

NSData *serialized = [[NSUserDefaults standardUserDefaults] objectForKey:@"myKey"];
NSArray *myArray = [NSKeyedUnarchiver unarchiveObjectWithData:serialized];

NSCodingこれを正しく機能させるには、クラスにプロトコルを実装しOccasion、さまざまなプロパティを正しく保存する必要があります。詳細については、「アーカイブおよびシリアライゼーション プログラミング ガイド」を参照してください。これを行うには、数行のコードしか必要ありません。何かのようなもの:

- (void)encodeWithCoder:(NSCoder *)coder {
    [super encodeWithCoder:coder];

    [coder encodeObject:_title forKey:@"_title"];
    [coder encodeObject:_date forKey:@"_date"];
    [coder encodeObject:_imagePath forKey:@"_imagePath"];
}

- (id)initWithCoder:(NSCoder *)coder {
    self = [super initWithCoder:coder];

    _title = [[coder decodeObjectForKey:@"_title"] retain];
    _date = [[coder decodeObjectForKey:@"_date"] retain];
    _imagePath = [[coder decodeObjectForKey:@"_imagePath"] retain];

    return self;
}
于 2011-10-12T16:45:24.790 に答える
4

NSUserDefaultsアプリケーションデータを保存するのではなく、ユーザー設定を目的としています。CoreDataを使用するか、オブジェクトをドキュメント ディレクトリにシリアル化します。NSCoding動作させるには、クラスにプロトコルを実装する必要があります。

NSCoding1 )実装Occasion.h

@interface Occasion : NSObject <NSCoding>

2) プロトコルを実装するOccasion.m

- (id)initWithCoder:(NSCoder *)aDecoder {

    if (self = [super init]) {

        self.title = [aDecoder decodeObjectForKey:@"title"];
        self.date = [aDecoder decodeObjectForKey:@"date"];
        self.imagePath = [aDecoder decodeObjectForKey:@"imagePath"];

    }            
    return self;
}

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

    [aCoder encodeObject:title forKey:@"title"];
    [aCoder encodeObject:date forKey:@"date"];
    [aCoder encodeObject:imagePath forKey:@"imagePath"];
}

3) ドキュメント ディレクトリ内のファイルにデータをアーカイブします。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                    NSUserDomainMask, YES);
NSString *documentsPath = [paths objectAtIndex:0];
NSString *path= [documentsPath stringByAppendingPathComponent:@“occasions”];
[NSKeyedArchiver archiveRootObject:occasions toFile:path];

4) アーカイブを解除するには...

NSMutableArray *occasions = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
于 2011-10-12T16:58:41.807 に答える
1

NSCodingで実装できますOccasion

次に、 を使用して配列からオブジェクト[NSKeyedArchiver archivedDataWithRootObject:myArray]を作成します。NSDataこれをユーザーのデフォルトに入れることができます。

于 2011-10-12T16:47:24.977 に答える