NSMutableDictionary
オブジェクトをNSUserDefaults
に保存したいのですが。 NSMutableDictionary
のキータイプはNSString
で、値のタイプはNSArray
です。これには、NSCoding
を実装するオブジェクトのリストが含まれます。ドキュメントごとに、NSString
とNSArray
は両方ともNSCoding
に準拠しています。
このエラーが発生しています:
[NSUserDefaults setObject:forKey:]:クラスNSCFDictionaryのプロパティ以外の値を挿入しようとしました。
保存する前に、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
を実装するオブジェクトのリスト」がプロパティリストオブジェクトではないオブジェクトを意味する場合、ユーザーのデフォルトに保存する前にそれらを使用する必要があります。
参考までに、プロパティリストクラスはNSDictionary
、NSArray
、NSString
、NSDate
、NSData
、およびNSNumber
です。可変サブクラス(NSMutableDictionary
など)をユーザー設定に書き込むことができますが、読み出したオブジェクトは常に不変です。
すべてのキーは辞書NSString
sにありますか?辞書をプロパティリストに保存するためには、それらが必要だと思います。
最も簡単な答え:
NSDictionary
は、キーがNSStringsの場合のみplistオブジェクトです。したがって、"Key"をNSString
とともにstringWithFormat
として保存します。
解決策:
NSString *key = [NSString stringWithFormat:@"%@",[dictionary valueForKey:@"Key"]];
利点:
NULL
の場合、Empty-Valueが追加されます。NSCoding
プロトコルの実装を検討したことがありますか?これにより、NSCoding
で実装される2つの単純なメソッドを使用して、iPhoneでエンコードとデコードを行うことができます。最初に、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に保存し、再びオンになったときに元の状態に戻す必要があるプロジェクトで非常に便利です。
重要なのは、インターフェイスにプロトコルを追加し、NSCoding
の一部である2つのメソッドを実装することです。
これがお役に立てば幸いです!
これ以上の解決策はありません。別のオプションは、コード化されたオブジェクトをディスクに保存することです-しかし、それは同じことをしています。どちらもNSDataになり、NSDataは元に戻すときにデコードされます。