1. ホーム
  2. ios

[解決済み] iOSでNSUserDefaultsがNSMutableDictionaryの保存に失敗するのはなぜですか?

2022-05-11 21:19:19

質問

を保存したいのですが NSMutableDictionary オブジェクトを NSUserDefaults . のキータイプは NSMutableDictionaryNSString の場合、値のタイプは NSArray を実装したオブジェクトのリストが含まれています。 NSCoding . ドキュメントごとに NSStringNSArray に準拠しています。 NSCoding .

このエラーが発生します。

[NSUserDefaults setObject: forKey:]: NSCFDictionaryクラスの非プロパティ値...を挿入しようとしました。

解決方法は?

保存する前に、ルートオブジェクトをエンコードする方法があります ( NSArray オブジェクト)を使って NSKeyedArchiver で終了する。 NSData . 次に、UserDefaults を使用して NSData .

データが必要なときは、読み出した NSData を使用します。 NSKeyedUnarchiver を変換するために NSData をオブジェクトに戻す。

との間で変換する必要があるため、少し面倒です。 NSData を毎回実行する必要がありますが、うまくいっています。

ここでは、1つのリクエストにつき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;
}

どなたか良い解決策をご存知ですか?

皆さん、ありがとうございます。