2011-02-04 17 views
9

Estoy tratando de hacer secciones en una vista de tabla según el alfabeto y ordenar mis entradas alfabéticamente en estas secciones.NSPredicar en NSDictionary

He recogido la primera letra en cada entrada de bandsArray en bandsArrayIndex y ahora estoy tratando de usar NSPredicate para contar cuántas de cada letra hay.

Estoy haciendo esto siguiendo this guide.

Están usando un NSArray y estoy usando un NSDictionary y parece que no puede hacer que funcione. ¿Puede alguien ayudarme?

La aplicación se bloquea al intentar mostrar la vista con la vista de tabla en ella. En depurador de consola se muestra el siguiente error:

* Terminación de aplicación debido a excepción no detectada 'NSInvalidArgumentException', razón: 'No se puede hacer una operación de subcadena con algo que no es una cadena

Este es mi código

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    NSString *alphabet = [bandsArrayIndex objectAtIndex:section]; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF beginswith[c] %@", alphabet]; 
    NSArray *letters = [bandsArray filteredArrayUsingPredicate:predicate]; 

    return [letters count]; 
} 

EDIT: Esta es mi banda sArray.

La cabecera

NSMutableArray *bandsArray; 

@property (nonatomic, retain) NSMutableArray* bandsArray; 

La aplicación

// set array from plist 
NSString *path = [[NSBundle mainBundle] pathForResource:@"Bands" ofType:@"plist"]; 
NSMutableArray* tmpArray = [[NSMutableArray alloc] initWithContentsOfFile:path]; 

self.bandsArray = tmpArray; 

// sort array after name ascending 
NSSortDescriptor *nameSorter = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)]; 
[bandsArray sortUsingDescriptors:[NSArray arrayWithObject:nameSorter]]; 
+0

Estás perdiendo memoria como un colador cuando se crea 'bandsArray '. –

+0

¿Puedes mostrar tus bandas? Array? ¿Es solo una matriz de NSString? No tuve tales problemas con NSPredicate. Debe ser solo un simple detalle. Si su bandsArray no es de NSStrings, debe filtrar por la propiedad que está buscando. –

Respuesta

22

¿Quiere decir que bandsArray es una serie de diccionarios? De ser así, y suponiendo que cada diccionario tiene una clave name, debería poder cambiar el predicado a algo como @"SELF.name beginswith[c] %@".

Si, por otro lado, bandsArray es en realidad un diccionario en sí, quizás desee hacer [[bandsArray allKeys] filteredArrayUsingPredicate...].

+0

'@" SELF.name comienza con [c]% @ "' hizo el truco! ¡Muchas gracias! – simonbs

+0

¡Gracias funcionó como un encanto! – Meet

0

Lo siento, no noté que tenía un NSArray de NSDictionaries.

Leer este tema: Using NSPredicate to filter an NSArray based on NSDictionary keys

Cuando se utiliza NSDictionary, usted debe comprobar por su llave ... No estoy seguro de que está utilizando el enfoque correcto!

Me gustaría hacer algo como: @implementation Palabra: NSObect { NSString * título; }

entonces yo crearía un NSArray de palabras y filtrar sobre ellos con: @ "título beginswith [c]% @"

6
#import <Foundation/Foundation.h> 
// clang -framework Foundation Siegfried.m 
    int 
main() { 
    NSArray *arr = @[ 
     @{@"1" : @"Fafner"}, 
     @{@"1" : @"Fasolt"} 
    ]; 
    NSPredicate *p = [NSPredicate predicateWithFormat: @"SELF['1'] CONTAINS 'e'"]; 
    NSArray *res = [arr filteredArrayUsingPredicate:p]; 
    NSLog(@"Siegfried %@", res); 
    return 0; 
} 
+0

Esta es la respuesta correcta, verificada –

+1

Gracias @isaak me ayudó mucho –