2011-07-06 30 views
2

複数のキー値を追加する必要があるため、NSMutableDictionaryを使用して「お気に入りに追加」機能を実装しようとしています。次のaddToFavouritesメソッドは、オブジェクトを辞書に追加した後も常にCount = 0を表示します。私はthisを読んで、(mutable配列の代わりに)mutabledictionaryにnsdefaultsを取得し、結果の辞書をnsdefaultsに設定し直しましたが、何が問題なのかはわかりません。どんな助けでも本当に感謝しています。ありがとうございました。iPhone:NSMutableDictionaryをNSUserDefaultsに保存することができません

編集: 投稿者this私は可変と不変の辞書の周りにデータを移動しなければならないことを知りました。変更されたNSMutableDictionaryをNSUserDefaultsに同期させることはできません。

-(BOOL)isAddedToFavorites:(NSString*)viewID { 
NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults]; 
NSMutableDictionary *favourites = [[standardUserDefaults objectForKey:kFavouriteItemsKey] mutableCopy]; 

if(favourites && [[favourites objectForKey:kFavouriteItemsKey] objectForKey:viewID]) 
return YES; 

return NO; 
} 

-(void)addToFavourites:(NSString*)viewID viewType:(NSString*)viewType { 
NSMutableDictionary *myMutableDictionary= [NSMutableDictionary dictionaryWithCapacity:[myDictionary count]+1]; 
[myMutableDictionary addEntriesFromDictionary:myDictionary]; 
[myMutableDictionary setObject:myObject forKey:myKey]; 


// Modified dictionary is not getting synced 
[[NSUserDefaults standardUserDefaults] setObject:myMutableDictionary forKey:kFavouriteItemsKey]; 
[[NSUserDefaults standardUserDefaults] synchronize]; 
} 

辞書データをNSDataに書き出しようとしましたが、軽度ではあるが重大な修正を加えた後に機能しました。

-(BOOL)isAddedToFavorites:(NSString*)viewID { 

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSData *data = [defaults objectForKey:kFavouriteItemsKey]; 
NSDictionary *favourites = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 

if(favourites && [favourites objectForKey:viewID]) 
    return YES; 

return NO; 
} 

-(void)addToFavourites:(NSString*)viewID viewType:(NSString*)viewType { 

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSData *data = [defaults objectForKey:kFavouriteItemsKey]; 
NSDictionary *myDictionary = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 

NSMutableDictionary *myMutableDictionary= [NSMutableDictionary dictionaryWithCapacity:[myDictionary count]+1]; 
[myMutableDictionary addEntriesFromDictionary:myDictionary]; 
[myMutableDictionary setObject:viewType forKey:viewID]; 


NSData *newdata = [NSKeyedArchiver archivedDataWithRootObject:myMutableDictionary]; 
[[NSUserDefaults standardUserDefaults] setObject:newdata forKey:kFavouriteItemsKey]; 
[[NSUserDefaults standardUserDefaults] synchronize]; 
} 

ありがとうございます。あなたは辞書内の要素のためにこれを実装する必要があります

+1

このhttp://stackoverflow.com/questions/471830/why-nsuserdefaults-failed-to-save-nsmutabledictionary-in-iphone-sdkは重複しているようです。助けてくれますか? – phi

+0

これは実際にはAppleDeveloperが文字列を格納していて、まだ問題があるように見えます。 – Joe

+0

@Irene:辞書の値をエンコードしようとしましたが、まだ動作しません!編集された質問を参照してください!エンコード辞書の – applefreak

答えて

2

-(void)encodeWithCoder:(NSCoder *)encoder 
{ 
    [encoder encodeObject:value forKey:@"Value"]; 
} 

-(id)initWithCoder:(NSCoder *)decoder 
{ 
    self.value = [decoder decodeObjectForKey:@"Value"]; 
    return self; 
} 
:辞書に

要素は、2つのメソッドを提供し、CommentItemの実装に続いて

@interface CommentItem : NSObject<NSCoding> { 
    NSString *value; 
} 

を実装します

@Ireneが提供するリンクに示唆されています。

+0

こんにちはOscarMk、それは私が理解できなかったものでした。私はいつどのようにこれらの方法が打ち切られるのか分からないのですか?なぜそれがわからなくても私のために働いたのですか?私は2番目のキーを追加しようとするときに小さな問題があります。私のXcodeは掛かっている!これが原因であるかどうかは分かりませんが、解決してください。編集した質問の完全なコードを参照してください。ありがとう。 – applefreak

+1

@AppleDeveloper nsdictionaryのオブジェクトがまだNSCodingを実装していない場合は、上記のコードが必要ですが、それがうまくいけば実装しています。これらのメソッドは、NSKeyedArchiverがアーカイブを解除してアーカイブするように呼び出されます。 –

+0

素晴らしい!私をずっと助けてくれてありがとうOscarMkさん、ありがとう!今は絶対にうまくいっています。 XCodeエディタが何か他の理由によるものかもしれない。 – applefreak

関連する問題