2012-06-01 13 views
8

En mi proyecto de Xcode Tengo las siguientes clases:Ordenar NSArray con la costumbre objetos

Dirección

@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 

Ubicación

@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 

En una subclase de UITableViewController, hay un NSArray que contiene una gran cantidad de objetos sin clasificar de LDLocations. Ahora, quiero ordenar los objetos de NSArray en orden ascendente según la propiedad ciudad de una LDAddress.

¿Cómo puedo ordenar la matriz usando NSSortDescriptor? Intenté lo siguiente, pero la aplicación se volcó al ordenar la matriz.

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

has necesitado apenas @ "ciudad" como la clave? –

Respuesta

15

Intente hacer la primera clave minúscula.

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

He trabajado perfectamente para mí =) Gracias – PhilippS

14

También puede ordenar una matriz con bloques:

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

Me gusta este enfoque el mejor !!!! –

+0

Probé tu codificación y funcionó, pero me gusta más ordenar una matriz con NSSortDescriptor. – PhilippS

+0

Totalmente trabajo gracias ... –

3

Esto permitirá ordenar con múltiples tipos. Al igual que tenemos que ordenar la película en función del tiempo y si el tiempo es igual, entonces debemos ordenar por nombre.

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; 
} 
Cuestiones relacionadas