2011-07-05 7 views
1

NSUserDefaultsを使用して「お気に入りに追加」機能を実装しようとしています。これまで私は以下のコードを書いています。iPhone:アプリケーションが終了したときにNSUserDefaultsの値を保持する

- (void)favouriteButtonClicked:(id)sender 
{ 
favselected = !favselected; // favselected is BOOL property 
MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; 
NSString* viewname = @"custom"; 

if(favselected) { 
    [favButton setBackgroundImage:[UIImage imageNamed:@"selected.png"] forState:UIControlStateNormal]; 
    [appDelegate addTOFavourites:self.ViewID viewType:self.ViewType]; 
} else { 
    [favButton setBackgroundImage:[UIImage imageNamed:@"unselected.png"] forState:UIControlStateNormal]; 
    [appDelegate removeFromFavourites:self.ViewID viewType:self.ViewType]; 
} 
} 

私のアプリケーションが実行されているように、それは限り、正常に動作しているが、私は自分のアプリケーションを殺したとき、私は次回のビューは、メソッドはfalseを返しますviewloadのisAddedToFavoritesに、ロードされたので、私のすべての格納された値を失っています。とにかく私の価値観を守ることはありますか?何か不足していますか?

if([appDelegate isAddedToFavorites:self.ViewID]) { 
     [favButton setBackgroundImage:[UIImage imageNamed:@"selected.png"] forState:UIControlStateNormal]; 
     favselected = YES; 
    } else { 
     [favButton setBackgroundImage:[UIImage imageNamed:@"unselected.png"] forState:UIControlStateNormal]; 
     favselected = NO; 
    } 

編集:

は私が複数のKey-Valueを追加する必要がありますが、以下のような方法があっても、常に辞書にオブジェクトを追加した後、カウント= 0を表示するようNSMutableDictionaryを使用してみました。どんな助けでも本当に感謝しています。ありがとうございました。

-(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 { 

NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults]; 
NSMutableDictionary *dict = [[standardUserDefaults objectForKey:kFavouriteItemsKey] mutableCopy]; 

if(standardUserDefaults) { 
    if(![dict objectForKey:viewID]) 
     [dict setObject:viewType forKey:viewID]; // It is coming here but still count zero! 

    NSLog(@"count = %d", [dict count]); 

    [standardUserDefaults setObject:dict forKey:kFavouriteItemsKey]; // Always dict remains null with 0 objects in it 
    [standardUserDefaults synchronize]; 
    [dict release]; 
} 
} 

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

NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults]; 
NSMutableDictionary *dict = [[standardUserDefaults objectForKey:kFavouriteItemsKey] mutableCopy]; 

if(standardUserDefaults) { 
    if ([dict objectForKey:viewID]) 
     [dict removeObjectForKey:viewID]; 

    [standardUserDefaults setObject:dict forKey:kFavouriteItemsKey]; 
    [standardUserDefaults synchronize]; 
    [dict release]; 
} 
} 

ありがとうございます。

+0

*あなたの投稿コードのすべて*をログアウトしてみてください。 – Moshe

+0

また、お気に入りの配列をどこかで初期化しましたか? – Moshe

+0

すべてをログアウトするとはどういう意味ですか?私はkFavoriteItemsKeyを変更しようとしましたが運はありませんでした。すでに存在しているデータを持つ辞書オブジェクトを既に初期化しています。データが利用できない場合、nullに設定されますが、それでも私は別々の初期化を行い、それが何か違いを生むのを見ます。 – applefreak

答えて

3

NSUserDefaultsは実際に値を永続的に保存するために使用されます。実際には、プログラムの設定を作成するとNSUserDefaultsとして保存されます。

私は問題は、取得しているのと同じキーで保存していないと思います。このように保存してください:

//To save 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setObject:appDefaults forKey:kFavouriteItemsKey]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 

    //To retrieve 
NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults]; 
NSMutableDictionary *favourites = [[standardUserDefaults objectForKey:kFavouriteItemsKey] mutableCopy]; 

辞書試みについて:

NSDictionary *myDictionary= [[NSUserDefaults standardUserDefaults] objectForKey:kFavouriteItemsKey]; 

     // Create a mutable dictionary to replace the old immutable dictionary 
    NSMutableDictionary *myMutableDictionary= [NSMutableDictionary dictionaryWithCapacity:[myDictionary count]+1]; 

     // transfer the old dictionary into the new dictionary 
    [myMutableDictionaryaddEntriesFromDictionary:myDictionary]; 

     // Now add the data 
    [myMutableDictionary setObject:myObject forKey:myKey]; 
+0

あなたは正しいです。それは私の悪かったです。以前は同じキーで無効なNSData値を保存していたため、問題が発生していました。私はキーの名前を変更し、それは働いた!ありがとうございました!ところで、この値はどこでiPhoneに保存されましたか?私のアプリケーションを参照せずに削除するにはどうすればいいですか?また、私のカウンターがいつもゼロになっているのか、他の質問がありましたか?それはまだ起こっている。私は複数のキー値を格納することができません。基本的に私は現在のデフォルトを変更可能な辞書にしています、それらを修正し、変更された辞書をデフォルトに設定しますが、動作していないようです! – applefreak

+0

@AppleDeveloperこの値はアプリケーション "sandbox"に格納されるため、アプリケーションを常に参照していますが、[[NSUserDefaults standardUserDefaults] removeObjectForKey:myKey];あなたが望むどんなNSUserDefaultsを削除するには、私はその質問を見たかどうか分からない、あなたはリンクを入れてください?、私はそれを調べることができますか? –

+0

こんにちはOscarMK、私は私の質問を編集して、またあなたが質問を理解するのに役立つコメントを入れました。私は長い間頭を傷つけています。何が起こっているのか理解できません!どんな助けでも本当に感謝しています。ありがとう。 – applefreak

関連する問題