2010-07-02 47 views
1

我有一個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

回答

2

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

5

把你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。