2010-07-02 5 views
1

나는 PList에 정의 된대로 시퀀스에 애니메이션에 액세스하려고하지만 (NSist에 저장 한 다음 애니메이션을 하나씩 재생하려고하는) plist가 있습니다. 순서대로 재생하지 마십시오. 예컨대 ,PList에서 Dictionary를 읽을 때 순서가 잘못되었습니다.

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

+0

순서는 같지만 잘못되었습니다. 뭔가 : 2, 4, 1, 3 – user381810

답변

2

사전은 배열과 같은 순서로 개체를 순서대로 저장하지 않으므로 키 - 값 쌍을 저장하여 구조가 실제로 어떤 순서로도 될 수 있습니다.

내가 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

답장을위한 고맙습니다. 또한 PList에서 NSArray의 문자열을 애니메이션 이름으로 직접 저장하려고했으나 문제가 여전히 존재하지만 시퀀스가 ​​아닙니다. 혼란스러워! – user381810

+0

내가 의미하는 예를 추가했습니다. 부모 사전을 제거하고 사전을 배열에 넣었습니다. – djhworld

5

에 (애니메이션 시퀀스를 정의하는) 당신의 NSDict 객체를 넣어 제안하는 것은 예, djhworld가 정확한지 - NSDictionary와 객체는 생성하고 순서대로 항목을 반환하지 않습니다.

나는 Objective C에 상당히 익숙하며 매우 똑같은 문제를 지적했다. 내가 해결 한 해결책은 여전히 ​​하나의 NSDictionary를 사용할 수있게했지만 사용하기 전에 키를 기반으로 항목을 정렬합니다.

-(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 

    } 

} 

주의해야 할 점은 ... 그런

+(NSArray *) sortedKeysForDictionary:(NSDictionary *)dict { 
    NSArray *keys = [dict allKeys]; 
    NSMutableArray *anArray = [NSMutableArray arrayWithArray:keys]; 
    keys = [anArray sortedArrayUsingSelector:@selector(localizedCompare:)]; 
    return keys; 
} 

난 그냥 순서대로 사전에서 그들을 당기는 키를 통해 실행하십시오 폴더의 유틸리티 클래스에서, 나는 키를 정렬하고 정렬 된 배열을 반환 제대로 정렬되는 키를 사용해야한다는 것입니다. 필자는 nnn : keyName 형식으로 키를 사용하는 규칙을 채택 했으므로이를 정렬 할 수 있지만 사람이 읽을 수있는 이름을 제공 할 수 있습니다. 예 : 001 : XYZ 처리.

관련 문제