145

NSMutableDictionaryオブジェクトを に保存したいと思いますNSUserDefaults。のキーの型NSMutableDictionaryNSString、値の型は ですNSArray。これには、 を実装するオブジェクトのリストが含まれていますNSCoding。ドキュメントごとにNSStringNSArray両方とも準拠していNSCodingます。

このエラーが発生しています:

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

4

6 に答える 6

230

保存する前に、 で終わる をNSArray使用してルート オブジェクト (オブジェクト) をエンコードします。次に、UserDefaults を使用して を保存します。NSKeyedArchiverNSDataNSData

データが必要な場合は、 を読み取りNSData、 を使用NSKeyedUnarchiverしてオブジェクトに変換NSDataします。

毎回変換する必要があるため、少し面倒ですが、NSDataうまくいきます。

リクエストごとの例を次に示します。

保存:

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;
}

誰もがより良い解決策を持っていますか?

みんな、ありがとう。

于 2009-01-23T04:56:44.447 に答える
105

オブジェクトをユーザーの既定値に保存する場合、すべてのオブジェクトは、再帰的に、すべて下にあるプロパティ リスト オブジェクトである必要があります。NSCoding に準拠することは、ここでは何の意味もありません。NSUserDefaultsそれらを自動的に にエンコードすることはありませNSDataん。「実装するオブジェクトのリストNSCoding」がプロパティ リスト オブジェクトではないオブジェクトを意味する場合は、ユーザーの既定値に保存する前にそれらを処理する必要があります。

参考までNSDictionaryNSArray、プロパティ リスト クラスは、、、、、、およびです。変更可能なサブクラス ( など) をユーザー設定に書き込むことができますが、読み込んだオブジェクトは常に不変です。NSStringNSDateNSDataNSNumberNSMutableDictionary

于 2009-01-23T04:44:19.607 に答える
14

すべてのキーが辞書にありますNSStringか?辞書をプロパティリストに保存するには、それらが必要だと思います。

于 2009-01-23T04:38:59.070 に答える
8

最も簡単な答え:

NSDictionaryキーが NSStringsの場合、plist オブジェクトのみです。そこで、 と同様に「鍵」を保管します。NSStringstringWithFormat


解決 :

NSString *key = [NSString stringWithFormat:@"%@",[dictionary valueForKey:@"Key"]];

利点 :

  1. String-Valueを追加します。
  2. 変数の値が の場合、Empty-Valueが追加されますNULL
于 2013-02-04T09:11:17.937 に答える
0

これ以上の解決策はありません。別のオプションは、コード化されたオブジェクトをディスクに保存することですが、それは同じことをしています。どちらも、元に戻したいときにデコードされる NSData になります。

于 2009-01-24T00:47:49.347 に答える