我有一個單例類,我設置了一個名爲completedLevels
的NSMutableDictionary
。NSMutableDictionary錯誤地設置對象
這是我如何設置它(在我單身的init
法):
NSString *mainPath = [[NSBundle mainBundle] bundlePath];
NSString *levelConfigPlistLocation = [mainPath stringByAppendingPathComponent:@"levelconfig.plist"];
NSDictionary *levelConfig = [[NSDictionary alloc] initWithContentsOfFile:levelConfigPlistLocation];
completedLevels = [[NSMutableDictionary alloc]init];
NSMutableDictionary *levelSets = [[NSMutableDictionary alloc]init];
NSMutableDictionary *levels = [[NSMutableDictionary alloc]init];
NSMutableDictionary *stats = [[NSMutableDictionary alloc]init];
[stats setObject:[NSNumber numberWithBool:NO] forKey:@"levelDone"];
[stats setObject:[NSNumber numberWithInt:0] forKey:@"stars"];
[stats setObject:[NSNumber numberWithInt:0] forKey:@"time"];
[stats setObject:[NSNumber numberWithInt:0] forKey:@"bestTime"];
for (int i = 1; i<=18; i++) {
[levels setObject:stats forKey:[NSString stringWithFormat:@"level%d", i]];
}
for(int i= 1; i<=15;i++){
NSString *lvlSet = [NSString stringWithFormat:@"levelSet%d", i];
[levelSets setObject:levels forKey:lvlSet];
}
NSArray *categoriesArray = [levelConfig objectForKey:@"categoriesArray"];
for (int i=0; i<[categoriesArray count]; i++) {
NSString *category = [[levelConfig objectForKey:@"categoriesArray"]objectAtIndex:i];
[completedLevels setObject:levelSets forKey:category];
}
我想解釋一下我的所作所爲:
我的目的是要建立這種形式的字典:在的的Levelset爲1的整數的情況下
category = {
levelSet1 ={
level1 ={
bestTime = 0;
levelDone = 0;
stars = 0;
time = 0;
};
level2={
bestTime = 0;
levelDone = 0;
stars = 0;
time = 0;
};
.
.
.
}
levelSet2 ={
level1 ={
bestTime = 0;
levelDone = 0;
stars = 0;
time = 0;
};
level2={
bestTime = 0;
levelDone = 0;
stars = 0;
time = 0;
};
.
.
.
}
.
.
.
}
%d至15
%d在級別爲1至18的整數情況下。
我有幾個類別,因此有多個上面的例子。
這很好,在調用NSLog時,字典會出現在我的控制檯中,因爲它應該。 的問題,但是,出現的時候我想改變我的字典一些條目顯示在下面的例子:
NSString *category = [[GameStateSingleton sharedMySingleton]getCurrentCategory];
NSString *levelSet = [NSString stringWithFormat:@"levelSet%d",[[GameStateSingleton sharedMySingleton]getSharedLevelSet]];
NSNumber *currentLevel = [NSNumber numberWithInt:[[GameStateSingleton sharedMySingleton]getSharedLevel]];
NSString *levelString = [NSString stringWithFormat:@"level%d", [currentLevel intValue]];
NSMutableDictionary *categories = [[NSMutableDictionary alloc]initWithDictionary:
[[GameStateSingleton sharedMySingleton]getCompletedLevels]];
[[[[categories objectForKey:category]objectForKey:levelSet]objectForKey:levelString]setObject:[NSNumber numberWithBool:YES] forKey:@"levelDone"];
[[GameStateSingleton sharedMySingleton]setCompletedLevels:categories];
NSLog(@"%@",[[GameStateSingleton sharedMySingleton]getCompletedLevels]);
要說明的是:
當玩家與水平做,我想levelDone
條目可以更改其值。但是當我之後登錄時,所有類別的所有levelDone
條目突然變爲BOOLEAN值1.爲什麼?
------------------- update -----------------------
completedLevels = [[NSMutableDictionary alloc]init];
NSMutableDictionary *levelSets = [[NSMutableDictionary alloc]init];
NSMutableDictionary *levels = [[NSMutableDictionary alloc]init];
NSMutableDictionary *stats = [[NSMutableDictionary alloc]init];
[stats setObject:[NSNumber numberWithBool:NO] forKey:@"levelDone"];
[stats setObject:[NSNumber numberWithInt:0] forKey:@"stars"];
[stats setObject:[NSNumber numberWithInt:0] forKey:@"time"];
[stats setObject:[NSNumber numberWithInt:0] forKey:@"bestTime"];
for (int i = 1; i<=18; i++) {
NSMutableDictionary *statsCopy = [stats mutableCopy];
[levels setObject:statsCopy forKey:[NSString stringWithFormat:@"level%d", i]];
[statsCopy release];
}
for(int i= 1; i<=15;i++){
NSString *lvlSet = [NSString stringWithFormat:@"levelSet%d", i];
NSMutableDictionary *levelsCopy = [levels mutableCopy];
[levelSets setObject:levelsCopy forKey:lvlSet];
[levelsCopy release];
}
NSArray *categoriesArray = [levelConfig objectForKey:@"categoriesArray"];
for (int i=0; i<[categoriesArray count]; i++) {
NSString *category = [[levelConfig objectForKey:@"categoriesArray"]objectAtIndex:i];
NSMutableDictionary *levelSetsCopy = [levelSets mutableCopy];
[completedLevels setObject:levelSetsCopy forKey:category];
[levelSetsCopy release];
}
,我檢索和設置保持不變的部分...
__ _ __ _ __ _ __ _ __ _ __SOLUTION_ __ _ __ _ __ _ __ _ __ _ ____
NSMutableDictionary *mutableCopy = (NSMutableDictionary *)CFPropertyListCreateDeepCopy(kCFAllocatorDefault, (CFDictionaryRef)originalDictionary, kCFPropertyListMutableContainers);
我做深副本用這種方法。
爲什麼當一個數組可以正常工作時使用字典,因爲你的'字符串鍵'實際上只是一些文本加上真正的索引? –