从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指导我如何加载序列中的动画?

+0

每次都是不同的随机顺序还是每次都是相同的顺序(但是错误的)? – deanWombourne 2010-07-02 08:12:30

+0

这是相同的顺序,但错误。例如:2,4,1,3 – user381810 2010-07-02 09:55:36

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> 
+0

Thanx回复。 我也尝试直接从Plist中存储NSArray中的动画名称字符串,但问题仍然存在,它们仍然没有按顺序排列。 困惑! – user381810 2010-07-02 09:21:38

+0

我已经添加了一个我的意思的例子 - 我已经删除了父字典,并把字典放在一个数组中 – 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。