2012-05-08 19 views
11

Mam obiekty NSArray obiektów NSDictionary. Chcę filtrować tablicę na podstawie kluczy słowników za pomocą NSPredicate. Robiłem coś takiego:Filtrowanie NSArray obiektów NSDictionary przy użyciu NSPredicate

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

Działa to dobrze, jeśli klucz przekazany jest jedno słowo: kolor, nazwa, wiek. Ale nie działa, jeśli klucz jest wielowyrazowy, jak: Wiek osoby, Imię osoby.

Zasadniczo każdy klawisz zawierający spację nie działa. Próbowałem umieszczać pojedyncze cytaty wokół klucza w łańcuchu, tak jak robiono to po stronie wartości, ale to też nie działało. Próbowałem również podwójnych ofert, ale bezskutecznie.

Prosimy o doradztwo w tej sprawie. Z góry dziękuję.

+2

try% K - to praca dobrze w danych podstawowych – user170317

+0

możliwe duplikat [NSPredicate formacie ciąg nie działa] (http://stackoverflow.com/questions/12413929/nspredicate-format -string-doesnt-work) – Monolo

Odpowiedz

16

Podczas używania klucza dynamicznego należy używać tokena %K zamiast %@. Nie chcesz również cytatów wokół tokena wartości. Powodują one, że twój predykat testuje równość w stosunku do literalnego ciągu znaków @"%@" zamiast przed value.

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

Jest to udokumentowane w Predicate Format String Syntax guide.


Edytuj: Jak zauważa Anum Amin, +[NSString stringWithFormat:] nie obsługuje formatów predykatów. Zamiast tego potrzebujesz [NSPredicate predicateWithFormat:@"%K == %@", key, value].

+5

NSString nie zastąpi% K poprawnie. Należy użyć '[NSPredicate predicateWithFormat:]'. Zobacz moją odpowiedź poniżej. – NightFury

+0

@AumumAmin: Masz absolutną rację. Przypuszczam, że właśnie to otrzymuję za próbę "naprawienia" kodu Bittu, zamiast tworzenia go świeżego. Jestem zaskoczony, że nawet przyjął moją odpowiedź tak jak jest. –

+0

Używałem już NSPredicate predicateWithFormat: więc łatwo było zrobić to w tym oświadczeniu zamiast osobnej instrukcji tworzenia NSString. Powinienem to wyjaśnić w komentarzu, ale Anum zrobił to dobrze :) – Bittu

23

Dla mnie odpowiedź Kevina nie zadziałała. Użyłem:

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

Dla osób grających w domu, opcjonalne '[cd]' daje zarówno niewrażliwość na kazirodztwo i diakrytę. – smacdonald

Powiązane problemy