回答:
私は保存する前に、私はルートオブジェクト(エンコード、一つの代替を発見NSArray
使用してオブジェクト)NSKeyedArchiver
、との両端をNSData
。次に、UserDefaultsを使用してを保存しNSData
ます。
私は、データを必要とするとき、私は読み出しNSData
、および使用がNSKeyedUnarchiver
変換するNSData
オブジェクトに戻します。
NSData
毎回変換する必要があるので少し面倒ですが、うまくいきます。
リクエストごとの1つの例を次に示します。
保存する:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSMutableArray *arr = ... ; // set value
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:arr];
[defaults setObject:data forKey:@"theKey"];
[defaults synchronize];
負荷:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [defaults objectForKey:@"theKey"];
NSArray *arr = [NSKeyedUnarchiver unarchiveObjectWithData:data];
配列の要素は実装します
@interface CommentItem : NSObject<NSCoding> {
NSString *value;
}
次に、の実装でCommentItem
、2つのメソッドを提供します。
-(void)encodeWithCoder:(NSCoder *)encoder
{
[encoder encodeObject:value forKey:@"Value"];
}
-(id)initWithCoder:(NSCoder *)decoder
{
self.value = [decoder decodeObjectForKey:@"Value"];
return self;
}
誰かがより良い解決策を持っていますか?
みんな、ありがとう。
オブジェクトをユーザーデフォルトに保存する場合、すべてのオブジェクトは、再帰的に、ずっと下にあるプロパティリストオブジェクトでなければなりません。NSCodingに準拠しても、ここでNSUserDefaults
は何も意味しません。自動的ににエンコードされNSData
ないので、自分で行う必要があります。「実装NSCoding
するオブジェクトのリスト」がプロパティリストオブジェクトではないオブジェクトを意味する場合、ユーザーデフォルトに保存する前に、それらを使用して何かを行う必要があります。
FYIプロパティリストクラスはNSDictionary
、NSArray
、NSString
、NSDate
、NSData
、とNSNumber
。変更可能なサブクラス(などNSMutableDictionary
)をユーザー設定に書き込むことができますが、読み取るオブジェクトは常に不変です。
すべてのキーは辞書にありますNSString
か?辞書をプロパティリストに保存するために必要です。
最も簡単な答え:
NSDictionary
キーがNSStringの場合は、plistオブジェクトのみです。したがって、と同様に「キー」を保存します。NSString
stringWithFormat
解決 :
NSString *key = [NSString stringWithFormat:@"%@",[dictionary valueForKey:@"Key"]];
利点 :
NULL
。NSCoding
プロトコルの実装を検討することを検討しましたか?これにより、で実装される2つのシンプルなメソッドを使用して、iPhoneでエンコードおよびデコードできますNSCoding
。まずNSCoding
、クラスにを追加する必要があります。
次に例を示します。
これは.hファイルにあります
@interface GameContent : NSObject <NSCoding>
次に、NSCodingプロトコルの2つのメソッドを実装する必要があります。
- (id) initWithCoder: (NSCoder *)coder
{
if (self = [super init])
{
[self setFoundHotSpots:[coder decodeObjectForKey:@"foundHotSpots"]];
}
return self;
}
- (void) encodeWithCoder: (NSCoder *)coder
{
[coder encodeObject:foundHotSpots forKey:@"foundHotSpots"];
}
詳細については、NSCoderのドキュメントをご覧ください。これは、アプリケーションが閉じている場合にiPhoneでアプリケーションの状態を保存し、アプリケーションが再びオンになったときの状態に戻す必要がある私のプロジェクトに非常に役立ちます。
重要なのは、プロトコルをインターフェイスに追加して、の一部である2つのメソッドを実装することですNSCoding
。
これが役に立てば幸いです!