Ложный порядок при чтении словаря из PList - PullRequest
1 голос
/ 02 июля 2010

У меня есть plist, из которого я пытаюсь получить доступ к его анимации в последовательности (как определено в PList), но когда я сохраняю ее в NSDictionary, а затем пытаюсь воспроизводить анимацию одну за другой, она не воспроизводит их последовательно. например,

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>

Плз, как мне загрузить анимацию по порядку?

Ответы [ 2 ]

5 голосов
/ 02 июля 2010

Да, 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.

2 голосов
/ 02 июля 2010

Словари не хранят объекты по порядку в последовательности, подобной массиву, они хранят пары ключ-значение, поэтому структура может фактически быть в любом порядке.

Я предлагаю поместить ваши объекты NSDict (которые определяютваши анимационные последовательности) в 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>
...