Comment mettre à jour une NSUserDefault
J'ai le code suivant qui devrait mettre à jour une valeur dans NSUserDefaults:
- (id) createBoardWithTitle:(NSString *)pTitle withScores:(NSArray *)pScores andNames:(NSArray *)pNames andDisplayStrings:(NSArray *)pStrings orderBy:(NSString *)pOrder ofType:(NSString *)pType
{
if((self == [super init]))
{
boardEntries = [NSMutableArray arrayWithCapacity:10];
//Build the data
for(...){
//populate boardEntries
}
//create an Dictionary to save
NSDictionary *savedData = [NSDictionary dictionaryWithObjectsAndKeys:pType, @"type", pOrder, @"order", boardEntries, @"entries", nil];
//Load the old boards
NSDictionary *existingBoards = [[NSUserDefaults standardUserDefaults] objectForKey:@"BlockDepotLeaderboards"];
//Create a mutable dictionary to replace the old immutable dictionary
NSMutableDictionary *newBoards = [NSMutableDictionary dictionaryWithCapacity:[existingBoards count]+1];
//transfer the old dictionary into the new dictionary
[newBoards addEntriesFromDictionary:existingBoards];
//add the new board to the new dictionary
[newBoards setObject:savedData forKey:pTitle];
//check to make sure it looks like it should by eye
NSLog(@"New Boards: %@", newBoards);
//Replace the old date in NSUserdefaults
[[NSUserDefaults standardUserDefaults] setObject:newBoards forKey:@"BlockDepotleaderboards"];
//Update: Do I really need to call this?
[[NSUserDefaults standardUserDefaults] synchronize];
//Check to make sure it looks as it should by eye
NSLog(@" Defaults--- %@", [[NSUserDefaults standardUserDefaults] objectForKey:@"BlockDepotLeaderboards"]);
}
return self;
}
Aussi loin que je peux dire, c'est du code. C'est probablement "wordier" qu'il doit être peut-être. Mais comme je le comprends, rien retourné à partir de NSUserDefaults sera immuable, j'ai donc recréer un objet Mutable, ajouter ce qui doit ajouter ensuite, remplacez l'objet dans NSUserDefaults. Et je pense que je vais essayer ci-dessus devrait fonctionner.
la sortie pour NSLog(@"Nouveaux tableaux: %@", newBoards) id
New Boards: {
"Marathon: Times" = {
entries = (
{
displayString = "10:00";
name = "Tom Elders";
score = 600;
},
{
displayString = "10:30";
name = "A.R. Elders";
score = 630;
},
{
displayString = "11:00";
name = "L. Lancaster-Harm";
score = 660;
},
//and so on.....
);
order = ASC;
type = TIMES;
};
String = Test;
}
"String = test" est juste un test d'entrée est située dans la AppDelegate.m fichier comme ceci:
if(![[NSUserDefaults standardUserDefaults] objectForKey:@"BlockDepotLeaderboards"]){
NSMutableDictionary *leadboardHolder = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"Test", @"String", nil];
[[NSUserDefaults standardUserDefaults] setObject:leadboardHolder forKey:@"BlockDepotLeaderboards"];
[[NSUserDefaults standardUserDefaults] synchronize];
}else{
NSLog(@"Leaderboards Dict Exists %@", [NSUserDefaults standardUserDefaults]);
}
Donc je sais que ce que je suis après est bel et bien là. Je sais juste que cela va être quelque chose de stupide que je suis absent. Mais je ne peux pas le voir ou le comprendre.
N'importe qui peut voir ce que je suis le désordre?
objectForKey:@"BlockDepotLeaderboards"
. Vous n'avez aucune idée de ce que l'objet retourné sera effectivement. Utilisez -dictionaryForKey: au lieu de cela, et de gérer le cas de nul par la création d'un nouveau dictionnaire.si vous accédez à des valeurs de NSUserDefaults vous devez soit utiliser dictionForKey: ou transtypage de l'objet dans le dictionnaire
OriginalL'auteur gargantuan | 2009-12-12
Vous devez vous connecter pour publier un commentaire.
Un moyen plus facile est de faire un mutableCopy de l'immuable dictionnaire comme ceci:
Aussi,
synchronize
est utilisée pour forcer l'enregistrement de l'utilisateur par défaut du disque. C'est seulement influencer ce que vous voyez lorsque vous ouvrez le fichier plist dans le Finder. Du point de vue de l'applicationNSUserDefaults
est toujours up-to-date. Aussi, les valeurs par défaut sont automatiquement sauvegardés chaque peu de temps, pour la seule fois où vous aurez probablement jamais besoin d'appelersynchronize
est lorsque l'application se termine.OriginalL'auteur Adrian
Selon les docs:
Êtes-vous sûr de tous les objets que vous essayez de serialise? Jetez un oeil à
NSKeyedArchiver
Aussi regarder cette question Pourquoi NSUserDefaults pu sauver NSMutableDictionary dans le SDK de l'iPhone?
OriginalL'auteur lyonanderson
Au premier abord sauver quoi que ce soit:
Puis exécutez ce code pour mettre à jour la valeur de la clé:
Vous n'avez pas besoin de retirer l'objet. Juste mettre à jour la même clé. Il mettra à jour la Valeur de cette clé.
Espérons que cette aide.
OriginalL'auteur Raj Aryan