J'ai écrit une méthode rapide pour prendre un tableau source (d'objets qui sont tous hors d'usage) et un tableau de référence (qui a des objets dans un choix (et totalement arbitraire) order), et retourne un tableau où les éléments du tableau source ont été réorganisés pour correspondre au tableau de référence.
- (NSArray *) reorderArray:(NSArray *)sourceArray toArray:(NSArray *)referenceArray
{
NSMutableArray *returnArray = [[NSMutableArray alloc] init];
for (int i = 0; i < [referenceArray count]; i++)
{
if ([sourceArray containsObject:[referenceArray objectAtIndex:i]])
{
[returnArray addObject:[arrReference objectAtIndex:i]];
}
}
return [returnArray copy];
}
Notez que c'est très fragile. Il utilise NSArray
méthode containsObject:
, qui appellera finalement NSObject
's isEqual:
. Fondamentalement, il devrait fonctionner très bien pour les tableaux de NSString
s, NSNumber
s, et peut-être NSDate
s (n'ont pas encore essayé celui-là), mais en dehors de cela, YMMV. J'imagine que si vous essayiez de passer des tableaux de UITableViewCell
s ou d'un autre objet vraiment complexe, il se détruirait totalement lui-même, et écraserait ou renverrait la totalité des ordures. De même, si vous deviez faire quelque chose comme passer un tableau de NSDate
s comme tableau de référence et un tableau de NSString
s comme le tableau source. En outre, si le tableau source contient des éléments non couverts dans le tableau de référence, ils seront simplement supprimés. On pourrait résoudre certains de ces problèmes en ajoutant un peu de code supplémentaire. Cela dit, si vous essayez de faire quelque chose de simple, cela devrait fonctionner correctement. Dans votre cas, vous pouvez construire le tableau de référence lorsque vous parcourez votre setValue:forKey:
.
NSMutableArray *referenceArray = [[NSMutableArray alloc] init];
NSMutableDictionary *yourDictionary = [[ NSMutableDictionary alloc] init];
for (//whatever you are looping through here)
{
[yourDictionary setValue://whatever forKey:key];
[referenceArray addObject:key];
}
Ensuite, lorsque vous voulez faire une boucle sur vos articles dans l'ordre où ils sont venus, vous juste
for (NSString *key in [self reorderArray:[myDict allKeys] toArray:referenceArray])
Les clés ne sont pas fixes, elles sont dynamiques. – Matrix