2012-05-08 55 views
11

我有NSArray的NSDictionary對象。我想使用NSPredicate根據字典的鍵過濾數組。我一直在做這樣的事情:使用NSPredicate過濾NSDictionary對象的NSArray

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

這工作正常,如果他們的鑰匙傳入是單詞:顏色,名稱,年齡。但是,如果密鑰是多字,則不起作用,如:人員年齡,人員姓名。

基本上,任何包含空格的鍵都不起作用。我曾嘗試在字符串的鍵中放置單引號,就像它們在值的一邊做的一樣,但那也不起作用。也試過雙引號,但無濟於事。

請指教。提前致謝。

+2

嘗試%K - 這是核心數據,做工精細 – user170317

+0

[NSPredicate格式字符串不工作(可能重複http://stackoverflow.com/questions/12413929/nspredicate-format -string-doesnt-work) – Monolo

回答

16

使用動態密鑰時,應該使用%K令牌而不是%@。您也不需要價值標記周圍的引號。他們將導致你的謂詞測試與文字字符串@"%@"相等而不是針對value

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

這記錄在Predicate Format String Syntax guide


編輯:As Anum Amin指出,+[NSString stringWithFormat:]不處理謂詞格式。您需要改爲[NSPredicate predicateWithFormat:@"%K == %@", key, value]

+5

NSString不會正確替換%K。應該使用'[NSPredicate predicateWithFormat:]'。請參閱下面的答案。 – NightFury

+0

@AnumAmin:你是對的。我想這就是我試圖「修復」Bittu的代碼而不是創造新鮮的代碼。我很驚訝他甚至接受了我的答案。 –

+0

我已經使用NSPredicate predicateWithFormat:因此,在該語句中執行它很容易,而不是創建NSString的單獨語句。我應該在評論中澄清它,但Anum做得很好:) – Bittu

23

對我來說,凱文的答案沒有奏效。我用:

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

對於那些在家裏玩的人來說,可選的'[cd]'給你的病例和變音不敏感。 – smacdonald

相關問題