2012-06-01 17 views
8

In meinem Xcode-Projekt habe ich die folgenden Klassen:Sortieren NSArray mit benutzerdefinierten Objekte

Adresse

@interface LDAddress : NSObject{ 
    NSString *street; 
    NSString *zip; 
    NSString *city; 
    float latitude; 
    float longitude; 
} 

@property (nonatomic, retain) NSString *street; 
@property (nonatomic, retain) NSString *zip; 
@property (nonatomic, retain) NSString *city; 
@property (readwrite, assign, nonatomic) float latitude; 
@property (readwrite, assign, nonatomic) float longitude; 

@end 

Ort

@interface LDLocation : NSObject{ 
    int locationId; 
    NSString *name; 
    LDAddress *address; 
} 
@property (readwrite, assign, nonatomic) int locationId; 
@property (nonatomic, retain) LDAddress *address; 
@property (nonatomic, retain) NSString *name; 

@end 

In einer Unterklasse von UITableViewController gibt es ein NSArray, das viele unsortierte Objekte von LDLocations enthält. Nun möchte ich die NSArray-Objekte aufsteigend nach der Eigenschaft city einer LDAddress sortieren.

Wie kann ich das Array mit NSSortDescriptor sortieren? Ich habe Folgendes versucht, aber die App wird beim Sortieren des Arrays abgemeldet.

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Address.city" ascending:YES]; 
[_locations sortedArrayUsingDescriptors:@[sortDescriptor]]; 
+0

haben Sie versucht, nur @ "Stadt" als Schlüssel? –

Antwort

15

Versuchen Sie, den ersten Schlüssel Kleinbuchstaben.

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"address.city" ascending:YES]; 
+0

Ich arbeitete perfekt für mich =) Danke – PhilippS

14

Sie können auch ein Array mit Blöcken sortieren:

NSArray *sortedLocations = [_locations sortedArrayUsingComparator: ^(LDAddress *a1, LDAddress *a2) { 
     return [a1.city compare:a2.city]; 
    }]; 
+0

Ich mag diesen Ansatz der beste !!!! –

+0

Ich habe versucht, Ihre Codierung und es hat funktioniert, aber ich mag ein Array mit NSSortDescriptor mehr sortieren. – PhilippS

+0

Total arbeiten danke ... –

3

Das mit mehreren Arten sortieren können. Wie müssen wir den Film basierend auf der Zeit sortieren und wenn die Zeit gleich ist, dann muss nach dem Namen sortiert werden.

NSArray *sortedArray = [childrenArray sortedArrayUsingComparator:^NSComparisonResult(id a, id b) { 
     NSNumber *first = [NSNumber numberWithLong:[(Movie*)a timeInMillis]]; 
     NSNumber *second = [NSNumber numberWithLong:[(Movie*)b timeInMillis]]; 
     NSComparisonResult result = [first compare:second]; 
     if(result == NSOrderedSame){ 
      result = [((NSString*)[(Movie*)a name]) compare:((NSString*)[(Movie*)b name])]; 
     } 
     return result; 
    }]; 
1
-(NSArray*)sortedWidgetList:(NSArray*)widgetList 
{ 
    NSSortDescriptor *firstDescriptor = [[NSSortDescriptor alloc] initWithKey:@"itemNum" ascending:YES]; 

    NSArray *sortDescriptors = [NSArray arrayWithObjects:firstDescriptor, nil]; 

    NSArray *sortedArray = [widgetList sortedArrayUsingDescriptors:sortDescriptors]; 

    return sortedArray; 
} 
Verwandte Themen