2012-05-08 4 views
11

Possiedo un NSArray di oggetti NSDictionary. Voglio filtrare l'array in base alle chiavi dei dizionari usando NSPredicate. Ho fatto qualcosa di simile:Filtraggio NSArray di oggetti NSDictionary utilizzando NSPredicate

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

Questo funziona bene se chiave passato è una sola parola: colori, nome, età. Ma non funziona se la chiave è multi-parola, come: Person Age, Person Name.

Fondamentalmente, qualsiasi chiave che contiene uno spazio, non funziona. Ho provato a mettere le virgolette singole attorno alla chiave nella stringa, proprio come sono fatte sul lato del valore ma non ha funzionato neanche. Ho anche provato le doppie virgolette, ma senza risultato.

Si prega di avvisare su questo. Grazie in anticipo.

+2

provare% K - è lavorare bene nei dati fondamentali – user170317

+0

possibile duplicato del [formato stringa NSPredicate non funziona] (http://stackoverflow.com/questions/12413929/nspredicate-format -string-doesnt-work) – Monolo

risposta

16

Quando si utilizza una chiave dinamica, è necessario utilizzare il token %K anziché %@. Inoltre, non vuoi le virgolette attorno al token del valore. Faranno sì che il tuo predicato verifichi l'uguaglianza con la stringa letterale @"%@" anziché contro value.

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

questo è documentato nel Predicate Format String Syntax guide.


Edit: Come Anum Amin sottolinea, +[NSString stringWithFormat:] non gestisce i formati predicato. Vuoi invece [NSPredicate predicateWithFormat:@"%K == %@", key, value].

+5

NSString non sostituirà correttamente% K. Si dovrebbe usare '[NSPredicate predicateWithFormat:]'. Vedi la mia risposta qui sotto. – NightFury

+0

@AnumAmin: hai assolutamente ragione. Suppongo che sia quello che ottengo per cercare di "aggiustare" il codice di Bittu invece di crearlo fresco. Sono sorpreso che abbia persino accettato la mia risposta così com'è. –

+0

Stavo già usando il predicato NSPredicateWithFormat: così, è stato facile farlo in quella dichiarazione invece di una dichiarazione separata per la creazione di una NSString. Avrei dovuto chiarirlo in un commento, ma Anum lo ha fatto bene :) – Bittu

23

Per me, la risposta di Kevin non ha funzionato. Ho usato:

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

Per quelli che suonano a casa, l'opzione '[cd]' ti dà insensibilità al caso e al diacritico. – smacdonald