2013-01-11 88 views
0

我有一個plist與搜索顯示控制器一起工作,它包含一些數據成員喜歡的字典數組。Plist iOS中的NSPredicate

<root> (array) 
    <"Item 0"> (dictionary) 
    <"Name"></"Name" (String) 
    <"Work"></"Work"> (String) 
    <"Age"></"Work"> (Number) 
    </"Item 0"> 
    <"Item 1"> 
    .... 
    </"Item 1"> 
</root> 

我想使用NSPredicate篩選與搜索條件匹配的所有名稱。例如,搜索所有名字的「an」將會產生「Sandy」和「Alexander」。

到目前爲止,我已經試過了諸如:

NSPredicate *p = [NSPredicate predicateWithFormat:@"Name == %@", 
           filterText]; 
Results = [data filteredArrayUsingPredicate:p]; 

任何想法?謝謝。

回答

0

使用CONTAINSNSPredicate

下面的代碼提供case sensitive search

NSPredicate *p = [NSPredicate predicateWithFormat:@"Name CONTAINS %@", 
          filterText]; 
Results = [yourPlistDataArray filteredArrayUsingPredicate:p]; 

下面的代碼提供case insensitive search

NSPredicate *p = [NSPredicate predicateWithFormat:@"ANY Name CONTAINS %@", 
          filterText]; 
Results = [yourPlistDataArray filteredArrayUsingPredicate:p]; 

編輯:參見更多here

+0

貌似謂詞畸形,因爲它導致該錯誤:「NSInvalidArgumentException」的,原因:「左手側爲ALL或ANY操作者必須是一個NSArray或NSSet中」。 –

0

這可以顯示任何NSArray中搜索的非常通用的類型。它會根據您當前的NSDictionary項目進行調整,但您可以在此處創建更復雜的條件來對其進行過濾。

NSArray *originalArray = ...; 

NSString *searchText = ...; // this is a parameter only, it can be set freely 

NSArray *_filteredArray = [originalArray filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) { 
      NSDictionary *_dataRow = (NSDictionary *)evaluatedObject; 
      return ([[[_dataRow valueForKey:@"Name"] lowercaseString] rangeOfString:[searchText lowercaseString]].location != NSNotFound); 
     }]]; 

NSLog (@"%@", _filteredArray);