4
[filteredArray filterUsingPredicate:
   [NSPredicate predicateWithFormat:@"self BEGINSWITH[cd] %@", searchText]];

filteredArray単純なNSStringが含まれています。[こんにちは、私の、ゲット、アップ、セブンなど...];

で始まるすべての文字列を提供しますsearchText

しかし、文字列が「私の名前は」のような単語の組み合わせである場合、およびsearchText = nameNSPredicateこれを達成するためにどのように見えるでしょうか?

searchText = name更新:そして、結果をでしたいが、ではなくしたい場合はどうなるでしょうsearchText = ameか?多分このように:

 [filteredArray filterUsingPredicate:
       [NSPredicate predicateWithFormat:
        @"self BEGINSWITH[cd] %@ or self CONTENTS[cd] %@", 
        searchText, searchText]];

searchTextただし、最初に、を含む文字列の後にのみ、で始まる文字列を表示する必要がありますsearchText

4

2 に答える 2

5
[NSPredicate predicateWithFormat:@"self CONTAINS[cd] %@", searchText];

質問の拡張後に編集

NSArray *beginMatch = [filteredArray filteredArrayUsingPredicate:
  [NSPredicate predicateWithFormat:
    @"self BEGINSWITH[cd] %@", searchText]];
NSArray *anyMatch = [filteredArray filteredArrayUsingPredicate:
  [NSPredicate predicateWithFormat:
    @"self CONTAINS[cd] %@", searchText]];

NSMutableArray *allResults = [NSMutableArray arrayWithArray:beginMatch];
for (id obj in anyMatch) {
   if (![allResults containsObject:obj]) {
      [allResults addObject:obj];
   }
}
filteredArray = allResults;

これにより、重複するエントリがなく、目的の順序で結果が得られます。

于 2012-09-20T10:16:39.533 に答える
2

EDIT 実際に開始文字列の先頭から検索文字列の長さをチェックします。完全一致が見つかった場合は、フィルタリングされます

if u have name game tame lame
search Text : ame
filtered text would be: none

文字列の先頭から検索文字列の長さまでのチェックも含まれますが、開始、中間、または終了の正確な検索文字列が見つかった場合は、フィルタリングされます。

if u have name game tame lame
search Text : ame
filtered text would be: name game tame lame because all has ame

[NSPredicate predicateWithFormat:@"self CONTAINS '%@'", searchText];
于 2012-09-20T10:20:25.177 に答える