6

私はクックブック アプリケーションを作成していますが、作成したクラス (Recipe クラス) のデータを保存する方法を見つけることができませんでした。私が見た唯一の方法は、このメソッドを Recipe クラスに作成して、オブジェクトごとにクラスのすべての要素を個別に保存せずに、このクラスの内容を全体として保存することです。

-(void) writeToFile:(NSString *)file atomically:(BOOL)atomic{

}

しかし、このメソッドを使用してこのオブジェクトをファイルに保存するためにこれを実装する方法がまったくわかりません。プロパティのいくつかは次のとおりです。

NSString* name;
UIImage* recipePicture;
NSDate* dateAdded;
NSMutableArray* ingredients; //The contents are all NSStrings.

Recipe クラスのオブジェクトを保存する方法を知っている人はいますか? それを理解できないことに私は夢中になっています。どんな助けでも大歓迎です。「RecipeData.plist」というタイトルの .plist が既にあります。すべてのプロパティを plist に書き込み、実行時にそれらのプロパティを使用してレシピの新しいオブジェクトを初期化するだけでよいでしょうか?

4

2 に答える 2

5

採用:

@interface Recipe : NSObject<NSCoding>

埋め込む:

- (void)encodeWithCoder:(NSCoder *)coder
{
    [coder encodeObject:name_ forKey:@"name"];
    [coder encodeObject:recipePicture_ forKey:@"recipePicture"];
    [coder encodeObject:dateAdded_ forKey:@"dateAdded"];
    [coder encodeObject:ingredients_ forKey:@"ingredients"];

}

// Decode an object from an archive
- (id)initWithCoder:(NSCoder *)coder
{
    self = [super init];
    if (self!=NULL)
    {
       name_ = [coder decodeObjectForKey:@"name"];
       recipePicture_ = [coder decodeObjectForKey:@"recipePicture"];
       dateAdded_ = [coder decodeObjectForKey:@"dateAdded"];
       ingredients_ = [coder decodeObjectForKey:@"ingredients"];   
    }
    return self;
}

今あなたのセーブで:

- (void) save:(NSString*)path recipe:(Recipe*)recipe
{
    NSMutableData* data=[[NSMutableData alloc] init];
    if (data)
    {
        NSKeyedArchiver* archiver=[[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
        if (archiver)
        {
            [archiver encodeInt:1 forKey:@"Version"];
            [archiver encodeObject:recipe forKey:@"Recipe"];
            [archiver finishEncoding];

            [data writeToFile:path atomically:YES];

        }
     }
 }

そして負荷で:

- (Recipe*) load:(NSString*)path
{
    Recipe* ret=NULL;
    NSData* data=[NSData dataWithContentsOfFile:path];
    if (data)
    {
        NSKeyedUnarchiver* unarchiver=[[NSKeyedUnarchiver alloc] initForReadingWithData:data];
        if (unarchiver)
        {
            int version=[unarchiver decodeIntForKey:@"Version"];
            if (version==1)
            {
                 ret=(Recipe*)[unarchiver decodeObjectForKey:@"Recipe"];
            }
            [unarchiver finishDecoding];
        }
    }
    return ret;
}
于 2012-11-10T23:21:05.360 に答える