2012-05-08 14 views
11

Tengo un NSArray de objetos NSDictionary. Quiero filtrar la matriz en función de las claves de los diccionarios mediante NSPredicate. He estado haciendo algo como esto:Filtrado NSArray de objetos NSDictionary utilizando NSPredicate

NSString *predicateString = [NSString stringWithFormat:@"%@ == '%@'", key, value]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateString]; 
NSArray *filteredResults = [allResultsArray filteredArrayUsingPredicate:predicate]; 

Esto funciona bien si es aprobada en clave de una sola palabra: color, nombre, edad. Pero no funciona si la clave es de varias palabras, como: Persona Edad, Nombre de persona.

Básicamente, cualquier clave que contenga un espacio, no funciona. He tratado de poner comillas simples alrededor de la clave en la cadena, al igual que se hacen en el lado del valor, pero eso tampoco funcionó. También intenté comillas dobles, pero fue en vano.

Por favor, asesorar sobre esto. Gracias por adelantado.

+2

intento% K - que está bien el trabajo en los datos básicos – user170317

+0

posible duplicado de [formato de cadena NSPredicate no funciona] (http://stackoverflow.com/questions/12413929/nspredicate-format -string-doesnt-work) – Monolo

Respuesta

16

Al usar una clave dinámica, debe usar el token %K en lugar de %@. Tampoco quieres las comillas alrededor del token de valor. Harán que su predicado pruebe la igualdad contra la cadena literal @"%@" en lugar de contra value.

NSString *predicateString = [NSString stringWithFormat:@"%K == %@", key, value]; 

Esto está documentado en el Predicate Format String Syntax guide.


Edit: Como Anum Amin señala, +[NSString stringWithFormat:] no maneja formatos de predicado. Desea [NSPredicate predicateWithFormat:@"%K == %@", key, value] en su lugar.

+5

NSString no sustituirá% K correctamente. Uno debería usar '[NSPredicate predicateWithFormat:]'. Ver mi respuesta a continuación. – NightFury

+0

@AnumAmin: tienes toda la razón. Supongo que eso es lo que obtengo por tratar de "arreglar" el código de Bittu en lugar de crearlo de manera nueva. Me sorprende que incluso haya aceptado mi respuesta tal como está. –

+0

Ya estaba usando NSPredicate predicateWithFormat: así que fue fácil hacerlo en esa declaración en lugar de una instrucción separada para crear un NSString. Debería haberlo aclarado en un comentario, pero Anum lo hizo bien :) – Bittu

23

Para mí, la respuesta de Kevin no funcionó. Solía:

NSPredicate *predicateString = [NSPredicate predicateWithFormat:@"%K contains[cd] %@", keySelected, text];//keySelected is NSString itself 
     NSLog(@"predicate %@",predicateString); 
     filteredArray = [NSMutableArray arrayWithArray:[YourArrayNeedToFilter filteredArrayUsingPredicate:predicateString]]; 
+0

Para aquellos que juegan en casa, el '(cd)' opcional le da insensibilidad tanto casera como diacrítica. – smacdonald