配列または辞書をNSUserDefaultsに格納すると、ディスク上のplistに凝縮されます。これは、カスタムオブジェクトをplistに保存できる形式に変換する必要があることを意味します。オブジェクトが保持するデータのタイプに応じてこれを行う方法はたくさんありますが、このメソッドはほとんどすべてのカスタムオブジェクトで機能し、かなり堅牢である必要があります。
Appleのうまく設計されたフレームワークのおかげで、それを実現するのは非常に簡単です:)
プロトコルをProgram.h
追加します。<NSCoding>
@interface Program : NSObject <NSCoding>
次にProgram.m
、次のメソッドを実装していることを確認してください。
#pragma mark - NSCoding
-(void)encodeWithCoder:(NSCoder *)encoder
{
// For each of the Program's properties that needs to be stored.
[encoder encodeObject:self.property forKey:@"PropertyKey"];
}
-(id)initWithCoder:(NSCoder *)decoder
{
if (self=[super init]) {
self.property = [decoder decodeObjectForKey:@"PropertyKey"];
}
return self;
}
このプロトコルとそのメソッドを使用すると、カスタムオブジェクトをその場でエンコードおよびデコードできます。これは、オブジェクトを適切な形式に変換できるようにするために重要です。
次に、配列を保存する前にアーカイブします。したがって、コードを次のように置き換えます。
// Old Line
// [defaults setObject:tempArrayOfPrograms forKey:@"arrayOfPrograms"];
// New Lines
id archivedObject = [NSKeyedArchiver archivedDataWithRootObject:tempArrayOfPrograms];
[defaults setObject:archivedObject forKey:@"arrayOfPrograms"];
最後のステップは、途中でアーカイブを解除していることを確認することです。したがって、アレイをロードする場所はどこでも、NSUserDefaults
必ずアーカイブを解除してください。
// Get the archived array.
id archivedObject = [[NSUserDefaults standardUserDefaults] objectForKey:@"arrayOfPrograms"];
// Unarchive the array.
NSArray *unarchivedArray = [NSKeyedUnarchiver unarchiveObjectWithData:archivedObject];
// Its already a mutable array if you put a mutable array in but just to be safe.
NSMutableArray *arrayFromDefaults = [NSMutableArray arrayWithArray:unarchivedArray];