2013-02-18 9 views
12

Ich habe eine NSMutableArray, die NSIndexPath Objekte enthält, und ich möchte sie nach ihrer row, in aufsteigender Reihenfolge sortieren.Sortierung eines Arrays von NSIndexPfads

Was ist der kürzeste/einfachste Weg?

Dies ist, was ich versucht habe:

[self.selectedIndexPaths sortUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
    NSIndexPath *indexPath1 = obj1; 
    NSIndexPath *indexPath2 = obj2; 
    return [@(indexPath1.section) compare:@(indexPath2.section)]; 
}]; 

Antwort

13

Sie sagten, dass Sie von row sortieren möchten, aber Sie vergleichen section. Darüber hinaus ist sectionNSInteger, so dass Sie Methoden nicht aufrufen können.

Ändern Sie den Code wie auf dem row zu sortieren folgt:

[self.selectedIndexPaths sortUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
    NSInteger r1 = [obj1 row]; 
    NSInteger r2 = [obj2 row]; 
    if (r1 > r2) { 
     return (NSComparisonResult)NSOrderedDescending; 
    } 
    if (r1 < r2) { 
     return (NSComparisonResult)NSOrderedAscending; 
    } 
    return (NSComparisonResult)NSOrderedSame; 
}]; 
+0

danke! du rockst. – Eric

9

Sie auch NSSortDescriptors können NSIndexPath durch die ‚Reihe‘ Eigenschaft zu sortieren.

wenn self.selectedIndexPath ist nicht wandelbar:

NSSortDescriptor *rowDescriptor = [[NSSortDescriptor alloc] initWithKey:@"row" ascending:YES]; 
NSArray *sortedRows = [self.selectedIndexPaths sortedArrayUsingDescriptors:@[rowDescriptor]]; 

oder wenn self.selectedIndexPath ist ein NSMutableArray einfach wie folgt:

NSSortDescriptor *rowDescriptor = [[NSSortDescriptor alloc] initWithKey:@"row" ascending:YES]; 
[self.selectedIndexPaths sortedArrayUsingDescriptors:@[rowDescriptor]]; 

Einfache & kurz.

8

Für einen änderbaren Array:

[self.selectedIndexPaths sortUsingSelector:@selector(compare:)]; 

Für eine unveränderliche Array:

NSArray *sortedArray = [self.selectedIndexPaths sortedArrayUsingSelector:@selector(compare:)] 
3

In swift:

let paths = tableView.indexPathsForSelectedRows() as [NSIndexPath] 
let sortedArray = paths.sorted {$0.row < $1.row} 
+0

Ja, das Sortieren in funktionalen Sprachen ist viel kürzer. – kelin

+2

Dies funktioniert nur, wenn es nur einen Abschnitt gibt –

Verwandte Themen