0

我有一个使用搜索显示控制器的 plist,其中包含一个带有一些数据成员的字典数组。

<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];

有任何想法吗?谢谢。

4

2 回答 2

0

用于CONTAINS_NSPredicate

下面的代码给出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];

编辑:在这里参考更多

于 2013-01-11T03:44:00.410 回答
0

这可以向您展示 any 中非常通用的搜索类型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);
于 2013-01-11T15:57:01.110 回答