2017-02-10 2 views
1

Я создаю строку поиска, которая должна вести себя как панель поиска контактов iPhone. В настоящее время она частично. вот мой кодКак сделать панель поиска как приложение для iPhone contact Или панель поиска, которая обрабатывает более одного неполного kewords

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

главное отличие мой SearchBar обрабатывает одну неполную ключевое слово, но не более чем one.suppose array={{[email protected]"Asus Zenfone 3 Max"},{[email protected]"Asus Zenfone Go}} если я искать asu zen или zen ma то это показывает результат, но если поиск asus zen max то пойдет не так Все, что я хочу знать, это то, как обрабатывать несколько пробелов в поискеBar

ответ

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")); 

Я не очень уверен в регулярном выражении, но это должно сделать это. Вы можете использовать онлайн 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" 
) 
Смежные вопросы