2015-07-15 5 views
0

Интересно, есть ли способ поиска более одного слова с помощью UISearchDisplayController? Если я, например, хочу искать сообщения, содержащие как «Джеймс», так и «Лондон»? Или «Джеймс» и «Смит»?UISearchDisplayController с несколькими поисковыми терминами

Я искал, но не нашел ответа на этот вопрос.

Это то, что я делаю сейчас, чтобы увидеть, есть ли поисковый запрос в названии или адресе.

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope 
{ 
    NSMutableArray *searchItemsPredicate = [NSMutableArray array]; 
    NSPredicate *namePredicate = [NSPredicate predicateWithFormat:@"name contains[c] %@", searchText]; 
    [searchItemsPredicate addObject:namePredicate]; 
    NSPredicate *addressPredicate = [NSPredicate predicateWithFormat:@"address contains[c] %@", searchText]; 
    [searchItemsPredicate addObject:addressPredicate]; 
    NSCompoundPredicate *combinedPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:searchItemsPredicate]; 

    searchResults = [_array filteredArrayUsingPredicate:combinedPredicate]; 
} 

ответ

0

Возможное решение заключается в разделении каждого слова.
Вы можете использовать NSRegularExpression или просто использовать componentsSeparatedByString: (чтобы это было просто).

NSArray *words = [searchText componentsSeparatedByString:@" "]; 
NSMutableArray *allPredicates = [[NSMutableArray alloc] init]; 
for (NSString *aWord in words) 
{ 
    NSPredicate *addressPred = [NSPredicate predicateWithFormat:@"address contains[c] %@", aWord]; 
    NSPredicate *namePred = [NSPredicate predicateWithFormat:@"name contains[c] %@", aWord]; 
    [allPredicates addObject:addressPred]; 
    [allPredicates addObject:namePred]; 
} 

NSCompoundPredicate *finalPredicate = [[NSCompoundPredicate alloc] initWithType: NSOrPredicateType subPredicates:allPredicates]; 

searchResults = [_array filteredArrayUsingPredicate: finalPredicate]; 

Вы можете использовать более Complexe схему для «слов ограничений» (запятая и т.д.), чтобы отметить, например делимитацию:
Ищет @ «банан, яблоко фрукты» может быть на самом деле ищем «слова »: @« Банан »и« Яблочный фрукт », в этом случае строка разделителя будет«, »(и вам, возможно, придется обрезать пробелы).

Смежные вопросы