从PList阅读字典时的错误顺序
我有一个plist,我试图按顺序访问它的动画(在PList中定义),但是当我将它存储在NSDictionary中,然后尝试逐个播放动画时,它是不按顺序播放它们。 e.g,从PList阅读字典时的错误顺序
int index = 0;
[self playAnimation:[animTypes objectAtIndex:index++]];
[self playAnimation:[animTypes objectAtIndex:index++]];
这是我的plist的代码:
<plist version="1.0">
<dict>
<key>Boy</key>
<dict>
<key>Enter</key>
<dict>
<key>disabled</key>
<false/>
<key>halfCycle</key>
<true/>
<key>fps</key>
<integer>1</integer>
<key>defaultFrame</key>
<integer>0</integer>
<key>useZwoptex</key>
<true/>
<key>frames</key>
<array>
<string>boy-000.png</string>
</array>
</dict>
<key>Jump</key>
<dict>
<key>disabled</key>
<false/>
<key>halfCycle</key>
<true/>
<key>fps</key>
<integer>13</integer>
<key>defaultFrame</key>
<integer>0</integer>
<key>useZwoptex</key>
<true/>
<key>frames</key>
<array>
<string>boyjump-000.png</string>
<string>boyjump-001.png</string>
<string>boyjump-002.png</string>
</array>
</dict>
<key>Turnaround</key>
<dict>
<key>disabled</key>
<false/>
<key>halfCycle</key>
<true/>
<key>fps</key>
<integer>21</integer>
<key>defaultFrame</key>
<integer>0</integer>
<key>useZwoptex</key>
<true/>
<key>frames</key>
<array>
<string>boyturnaround-000.png</string>
<string>boyturnaround-001.png</string>
<string>boyturnaround-002.png</string>
</array>
</dict>
</dict>
</plist>
PLZ指导我如何加载序列中的动画?
Dictionarys不按顺序存储对象,就像数组一样,它们存储键值对,因此结构实际上可以按任意顺序排列。
我建议在NSArray
<plist version="1.0">
<array>
<dict>
<key>Name</key>
<string>Boy</string>
<key>disabled</key>
<false/>
<key>halfCycle</key>
<true/>
<key>fps</key>
<integer>1</integer>
<key>defaultFrame</key>
<integer>0</integer>
<key>useZwoptex</key>
<true/>
<key>frames</key>
<array>
<string>boy-000.png</string>
</array>
</dict>
<dict>
<key>Name</key>
<string>Jump</string>
<key>disabled</key>
<false/>
<key>halfCycle</key>
<true/>
<key>fps</key>
<integer>13</integer>
<key>defaultFrame</key>
<integer>0</integer>
<key>useZwoptex</key>
<true/>
<key>frames</key>
<array>
<string>boyjump-000.png</string>
<string>boyjump-001.png</string>
<string>boyjump-002.png</string>
</array>
</dict>
<dict>
<key>Name</key>
<string>Enter</string>
<key>disabled</key>
<false/>
<key>halfCycle</key>
<true/>
<key>fps</key>
<integer>21</integer>
<key>defaultFrame</key>
<integer>0</integer>
<key>useZwoptex</key>
<true/>
<key>frames</key>
<array>
<string>boyturnaround-000.png</string>
<string>boyturnaround-001.png</string>
<string>boyturnaround-002.png</string>
</array>
</dict>
</array>
</plist>
Thanx回复。 我也尝试直接从Plist中存储NSArray中的动画名称字符串,但问题仍然存在,它们仍然没有按顺序排列。 困惑! – user381810 2010-07-02 09:21:38
我已经添加了一个我的意思的例子 - 我已经删除了父字典,并把字典放在一个数组中 – djhworld 2010-07-02 09:51:41
把你NSDict对象(即定义动画序列)是的,djhworld是正确的 - 的NSDictionary对象不会在他们创建的顺序返回条目。
我对Objective C相当陌生,并且遇到了同样的问题。我制作的解决方案允许我仍然使用单个NSDictionary,但在使用它之前,我根据密钥对条目进行排序。在一个实用程序类,我的钥匙进行排序,并返回一个排序的数组:
+(NSArray *) sortedKeysForDictionary:(NSDictionary *)dict {
NSArray *keys = [dict allKeys];
NSMutableArray *anArray = [NSMutableArray arrayWithArray:keys];
keys = [anArray sortedArrayUsingSelector:@selector(localizedCompare:)];
return keys;
}
然后,我只是通过为了从字典中拉扯他们的钥匙跑...
-(void) processEntries {
NSArray *keys = [Utils sortedKeysForDictionary:myDictionary];
for (int i=0; i<keys.count; i++){
NSString *key = [keys objectAtIndex:i];
id dictEntry = [myDictionary valueForKey:key];
// process the entry here
}
}
唯一需要注意的是你必须使用正确排序的键。我采用了以nnn:keyName形式使用键的约定,所以我可以对它们进行排序,但仍然提供人类可读的名称。例如001:处理XYZ。
每次都是不同的随机顺序还是每次都是相同的顺序(但是错误的)? – deanWombourne 2010-07-02 08:12:30
这是相同的顺序,但错误。例如:2,4,1,3 – user381810 2010-07-02 09:55:36