2009-08-28 8 views
12

Je suis nouveau sur le support du SDK pour iPhone 3.0 d'Apple 3.0 et je suis relativement nouveau dans le développement de l'iPhone. Ma question porte sur un tri un peu plus "complexe" que ce qui est couvert dans les docs. Je soupçonne que je fais une hypothèse incorrecte et fondamentale.Comment faire pour trier un NSMutableArray d'objets gérés à travers un graphique d'objet

Comment puis-je trier une collection pré-extraite d'objets gérés par une propriété contenant plusieurs couches plus en profondeur dans la collection?

Exemple: Farm a un 1 à beaucoup de cow-boy (Farm.cowboys) Cowboy a un 1 à 1 à personne (Cowboy.person) personne a lastName (Person.lastName)

L'objet entier Le graphique a été récupéré et les cowboys sont affichés via un UITableView. Maintenant, comment trier les Cowboys par LastName? Ai-je besoin de les récupérer? et si oui, comment puis-je le faire avec un tri imbriqué?

Actuellement, j'essaie de trier un NSMutableArray de cowboys ([Farm.cowboys allobjects]) ce qui est bien pour ces propriétés sur Cowboy. Mais je ne sais pas comment faire ce travail lors du tri d'une collection de Cowboys par Cowboy.person.lastName?

Répondre

0

J'espère que quelqu'un a une meilleure solution. Cependant ....

Un objet wrapper avec un sélecteur de comparaison et une référence à l'objet de tri fonctionne. Ce n'est pas aussi propre que je le voudrais, alors j'espère que quelqu'un d'autre proposera une alternative.

En substance, CowboyWrapper a une propriété de cow-boy. CowboyWrapper a également un sélecteur de comparaison. En construisant et en synchronisant un NSMutableArray de CowboyWrappers, triez les travaux.

21

Si vous pouvez cibler 10.6, vous pouvez le faire en utilisant des blocs. Comme si:

- (NSArray *)sortedArray { 
    return [originalArray sortedArrayUsingComparator:(NSComparator)^(id obj1, id obj2){ 
    NSString *lastName1 = [[obj1 person] lastName]; 
    NSString *lastName2 = [[obj2 person] lastName]; 
    return [lastName1 caseInsensitiveCompare:lastName2]; }]; 
} 
+2

A noter également, si vous utilisez un 'NSMutableArray', vous pouvez simplement utiliser' sortUsingComparator: 'la place, si vous souhaitez . –

+0

Vous devez supprimer la distribution vers NSComparator. – Psycho

5

Vous pouvez trier comme ceci:

[myUnsortedArrayOfCowboys sortedArrayUsingDescriptors: 
    [NSArray arrayWithObject: 
     [NSSortDescriptor 
      sortDescriptorWithKey:"person.lastName" 
      ascending:YES]]]; 

Notez que le '' dans la clé descripteur de tri. C'est ainsi que vous traversez le graphe d'objets.

1

Si vous voulez trier le nombre et la chaîne puis utilisez cette

NSArray *unsortedArray = [NSArray arrayWithObjects:@"Hello", @"4", @"Hi", @"5", @"2", @"10", @"1", nil]; 
NSArray *sortedArray = [unsortedArray sortedArrayUsingComparator:^(id firstObject, id secondObject) { 
    return [((NSString *)firstObject) compare:((NSString *)secondObject) options:NSNumericSearch]; 
}];