1

Я реализовал SearchBar с помощью UISearchDisplayController и UITableView для отображения результатов поиска. Я использую libxml2 и xpath для анализа веб-сайта HTML и поиска содержимого, необходимого в исходном коде. Поскольку я новичок в ObjC, я использовал образец проекта TableSearch, предоставленный Apple для поиска и отображения части в качестве старта. Все отлично работает с этим, я могу разобрать конкретное содержимое с веб-сайта и правильно их комбинировать, как они появляются на веб-сайте, и отображать их в разных таблицах табличных представлений TableView. Я хочу использовать пользовательский ввод для поиска на нем определенного веб-сайта. У меня есть только следующая проблема:UISearchDisplayController с UISearchBar и UITableView - как избежать «живых результатов»?

Если вы посмотрите на проект TableSearch (класс MainViewController.m), вы заметите, что он обновляет «filteredListContent» и перезагружает TableView отображения автоматически, как типы пользователей:

[...] 

#pragma mark - 
#pragma mark Content Filtering 

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope 
{ 
/* 
    Update the filtered array based on the search text and scope. 
    */ 

[self.filteredListContent removeAllObjects]; // First clear the filtered array. 

/* 
    Search the main list for products whose type matches the scope (if selected) and whose name matches searchText; add items that match to the filtered array. 
    */ 
for (Product *product in listContent) 
{ 
    if ([scope isEqualToString:@"All"] || [product.type isEqualToString:scope]) 
    { 
    NSComparisonResult result = [product.name compare:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch) range:NSMakeRange(0, [searchText length])]; 
      if (result == NSOrderedSame) 
    { 
    [self.filteredListContent addObject:product]; 
      } 
    } 
} 
} 


#pragma mark - 
#pragma mark UISearchDisplayController Delegate Methods 

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString 
{ 
    [self filterContentForSearchText:searchString scope: 
    [[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]]; 

    // Return YES to cause the search result table view to be reloaded. 
    return YES; 
} 


- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption 
{ 
    [self filterContentForSearchText:[self.searchDisplayController.searchBar text] scope: 
    [[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:searchOption]]; 

    // Return YES to cause the search result table view to be reloaded. 
    return YES; 
} 


@end

Вы можете себе представить, что она требует некоторой памяти, когда я использую мои реализации для синтаксического анализа и поиска, и это особенно важно, когда она вызывается несколько раз, пока пользователь печатает, чтобы отобразить «живые результаты». Когда я использую только первую строку своего блока для разбора и поиска (инициализация объекта NSData с URL-адресом), SearchBar начинает отставать и задерживается на несколько секунд после ввода каждого символа. Когда я использую весь блок, приложение выходит из строя. Мой вопрос следующий:

Как можно дождаться нажатия кнопки «Поиск» или «Возврат» на клавиатуре перед тем, как выполнить поиск или где и как я могу проверить, была ли нажата кнопка? Извините за этот, возможно, тривиальный вопрос.

ответ

6

сделать свой объект делегата также делегат от панели поиска, и реализовать эти методы следующим образом:

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar { 
    [self filterContentForSearchText:[self.searchDisplayController.searchBar text] 
           scope:[[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]]; 
} 
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString { 
    return NO; 
} 
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption { 
    return NO; 
} 

Это предотвратит табличные от перегрузки в качестве типов пользователей или изменений масштаба, и перезагружается, когда кнопка поиска нажата. Тем не менее, таблица перезагружается при вводе первого символа. Я еще не нашел способ предотвратить это действие. Как бы то ни было, таблица, вероятно, не скажет никаких результатов при вводе первого символа.