je le code suivant qui devrait mettre à jour une valeur NSUserDefaults:Comment mettre à jour une NSUserDefault
- (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;
}
Pour autant que je peux dire, c'est le code pertinent. C'est probablement plus «verbeux» qu'il ne le faudrait peut-être. Mais si je comprends bien, tout ce qui est retourné par NSUserDefaults sera immuable, donc je dois le recréer comme un objet Mutable, ajouter ce qui doit être ajouté puis remplacer l'objet dans NSUserDefaults. Et je pense que ce que j'essaye ci-dessus devrait fonctionner.
la sortie pour NSLog (@ "De nouveaux conseils:% @", 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 une entrée de test et est défini dans le fichier AppDelegate.m comme celui-ci:
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 définitivement là. Je sais juste que ça va être quelque chose de stupide qui me manque. Mais je ne peux pas le voir ou le comprendre.
Quelqu'un peut-il voir ce que je bousille?
Ne pas faire 'objectForKey: @" BlockDepotLeaderboards "'. Vous n'avez aucune idée de ce que l'objet retourné sera réellement. Utilisez -dictionaryForKey: à la place, et manipulez le cas où il est nul en créant un nouveau dictionnaire. –
Si vous accédez aux valeurs de NSUserDefaults vous devez soit utiliser dictionForKey: soit transcrire l'objet dans le dictionnaire –