2017-02-10 8 views
1

私はiPhoneの連絡先検索バーのように振る舞うはずの検索バーを作成しています。 は、ここに私のコードですiPhone連絡先アプリとして検索バーを作る方法や複数の不完全なキーワードを扱う検索バー

-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString 
{ 
    NSRange whiteSpaceRange = [result rangeOfCharacterFromSet:[NSCharacterSet whitespaceCharacterSet]]; 
     if (whiteSpaceRange.location != NSNotFound) 
     { 
      NSString * stringAfterSpace = [result substringFromIndex:whiteSpaceRange.location]; 
      NSString * stringBeforeSpace= [result substringToIndex:whiteSpaceRange.location]; 

      NSPredicate *predicateForAfterSpace=[NSPredicate predicateWithFormat:@"catNm CONTAINS[cd] %@",stringAfterSpace]; 

      NSPredicate *predicateForBegining = [NSPredicate predicateWithFormat:@"catNm BEGINSWITH[cd] %@", stringBeforeSpace]; 

      NSPredicate *compoundPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[predicateForBegining, predicateForAfterSpace]]; 
      searchArray = [[dataArray filteredArrayUsingPredicate:compoundPredicate] mutableCopy]; 

     } 
     else 
     { 
      NSPredicate *predicateForBegining = [NSPredicate predicateWithFormat:@"catNm BEGINSWITH[cd] %@", result]; 

      NSString *stringAfterSpace=[NSString stringWithFormat:@" %@",result]; 
      NSPredicate *predicateForAfterSpace=[NSPredicate predicateWithFormat:@"catNm CONTAINS[cd] %@",stringAfterSpace]; 

      NSPredicate *compoundPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:@[predicateForBegining,predicateForAfterSpace]]; 
      searchArray = [[dataArray filteredArrayUsingPredicate:compoundPredicate] mutableCopy]; 
     } 
} 

主な違いは、私の検索バーが1つの不完全なキーワードを処理しますが、ある以上、one.suppose array={{[email protected]"Asus Zenfone 3 Max"},{[email protected]"Asus Zenfone Go}} 私はasus zen maxの検索が、それがうまくいかない場合asu zenまたはzen maが、それは結果を示しているが、検索した場合 私が知りたいのは、searchBarで複数のスペースを扱う方法です。

答えて

1

ここでは、正規表現(正規表現)を使用できます。

NSString *keyToFilter = @"catNm"; 

NSArray *dataArray = @[@{keyToFilter: @"Asus Zenfone 3 Max"}, 
        @{keyToFilter: @"Asus Zenfone Go"}]; 

NSArray *wordsSearched = [searchString componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; 

NSMutableString *pattern = [[NSMutableString alloc] initWithString:@".*\\b"]; 
[pattern appendString:[wordsSearched componentsJoinedByString:@".*\\b"]]; 
[pattern appendString:@".*"]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.%K MATCHES[C] %@", keyToFilter, pattern]; 
NSArray *filtered = [dataArray filteredArrayUsingPredicate:predicate]; 
NSLog(@"SearchString: %@\nFiltered: %@", searchString, ([filtered count]?[filtered valueForKey:keyToFilter]:@"NO RESULT")); 

私はregexには自信がありませんが、それはそれを行うべきです。より複雑なものを追加したい場合は、オンラインのRegexToolsを使用することができます。

結果/サンプルテスト:

$>SearchString: "asus zen max" 
Filtered: (
    "Asus Zenfone 3 Max" 
) 
$>SearchString: "zen ma" 
Filtered: (
    "Asus Zenfone 3 Max" 
) 
$>SearchString: "asu zen" 
Filtered: (
    "Asus Zenfone 3 Max", 
    "Asus Zenfone Go" 
) 
$>SearchString: "zen" 
Filtered: (
    "Asus Zenfone 3 Max", 
    "Asus Zenfone Go" 
) 
$>SearchString: "M" 
Filtered: (
    "Asus Zenfone 3 Max" 
) 
$>SearchString: "sams" 
Filtered: NO RESULT 
$>SearchString: "zen asu" 
Filtered: NO RESULT 
$>SearchString: "zen g" 
Filtered: (
    "Asus Zenfone Go" 
) 
$>SearchString: "a g" 
Filtered: (
    "Asus Zenfone Go" 
) 
関連する問題